[英]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)
相同的选项可用于从tidyr
中extract
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.