繁体   English   中英

如何在 R 中将一个字符列转换为多个数字列

[英]How to turn convert one character column into multiple numerical columns in R

我想将一个字符列分成多个数值列。

例如,我在表“final”中有这些列:

最后

sd2 文件
0.011 r100.0.8.1.1.csv
0.023 r10.0.2.0.1.csv
0.033 r10.0.95.0.0.csv

我想把它变成像下面这样的东西。 “文件”列分为 3 个单独的列,其中不再有“r”或“.csv”,前两个数字(即 100 和 0.8)在不同的列中,但最后一个(即 1.1)保留在一列 - 尽管如果更容易,这可以进一步分成两列(即“dom”列中的 1 和 1 可以在单独的列中)。

sd2 流行音乐 选择 dom
0.011 100 0.8 1.1
0.023 10 0.2 0.1
0.033 10 0.95 0.0

我使用 strsplit 使“文件”列成为字符串列表。

files <- final$file
files <- as.character(files)

per <- strsplit(files, "[.]")

我不确定如何将这些字符串转换为单独的列,同时放弃“r”和“.col”任何有关后续步骤的建议将不胜感激!

带有read.csv base R的选项。 在这里,我们可以将 substring 捕获为一个组,用,修改分隔符,并使用read.csv将该列作为data.frame读取,并将新列分配给base R中的“最终”数据集

final[c("pop", "sel", "dom")] <-  read.csv(text = 
  sub("^[a-z](\\d+)\\.(\\d+\\.\\d+)\\.([0-9.]+)\\.csv",
       "\\1,\\2,\\3", final$file), header = FALSE)

相同的选项可用于从tidyrextract

library(tidyr)
final %>%
    extract(file, into = c("pop", "sel", "dom"),
         "^[a-z](\\d+)\\.(\\d+\\.\\d+)\\.([0-9.]+)\\.csv", convert = TRUE)

-输出

#    sd2 pop  sel dom
#1 0.011 100 0.80 1.1
#2 0.023  10 0.20 0.1
#3 0.033  10 0.95 0.0

数据

final <- structure(list(sd2 = c(0.011, 0.023, 0.033), file = c("r100.0.8.1.1.csv", 
"r10.0.2.0.1.csv", "r10.0.95.0.0.csv")), class = "data.frame", row.names = c(NA, 
-3L))

一种选择是在字母或点处strsplit ,用非空元素创建一个矩阵,这些元素的相关列用"." paste在一起。 .

u <- unlist(strsplit(d$file, "[a-z]|\\."))
u <- matrix(u[nchar(u) > 0],,5,b=T)
res <- data.frame(sd2=d$sd2, sapply(list(pop=1, sel=2:3, dom=4:5), function(x) 
  as.double(apply(u[, x, drop=F], 1, paste, collapse="."))))
res
#     sd2 pop  sel dom
# 1 0.011 100 0.80 1.1
# 2 0.023  10 0.20 0.1
# 3 0.033  10 0.95 0.0

数据:

d <- structure(list(sd2 = c(0.011, 0.023, 0.033), file = c("r100.0.8.1.1.csv", 
"r10.0.2.0.1.csv", "r10.0.95.0.0.csv")), class = "data.frame", row.names = c(NA, 
-3L))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM