我有一个看起来像
的csv Deamon,Host,1:2:4,aaa.03
Pixe,Paradigm,1:3:5,11.us
我需要将其读入数据框进行分析,但我的数据中的第3列用以下内容分隔:并且需要像集合或列表一样读取1.e分割为:以便它返回(1,2,4) )。是否可以在R中包含具有类列表的列。或者你认为我能如何最好地解决这个问题。
答案 0 :(得分:4)
您可以使用strsplit
将字符向量拆分为组件列表:
x <- c("1:2:4", "1:3:5")
strsplit(x, split=":")
[[1]]
[1] "1" "2" "4"
[[2]]
[1] "1" "3" "5"
答案 1 :(得分:4)
如上所述,答案将根据列中分隔符的数量是否一致而变化。如果这个数字是一致的,答案会更直接。这是建立Andrie的strsplit
答案的一个答案:
dat <- read.csv("yourData.csv", header=FALSE, stringsAsFactors = FALSE)
#If always going to be a consistent number of separators
dat <- cbind(dat, do.call("rbind", strsplit(dat[, 3], ":")))
V1 V2 V3 V4 1 2 3
1 Deamon Host 1:02:04 aaa.03 1 02 04
2 Pixe Paradigm 1:03:05 11.us 1 03 05
请注意,上述内容实际上是colsplit.character
reshape
rbind.fill
的实施方式,对您来说可能是更好的选择,因为它会强制您提供正确的名称。
如果分隔符的数量不同,则使用plyr
是包rbind.fill
中的一个选项。 library(plyr)
x <- c("1:2:4", "1:3:5:6:7")
rbind.fill(
lapply(
lapply(strsplit(x, ":"), matrix, nrow = 1)
, as.data.frame)
)
V1 V2 V3 V4 V5
1 1 2 4 <NA> <NA>
2 1 3 5 6 7
期望data.frames有点烦人,我无法弄清楚如何获得一行data.frame而不先转换为矩阵,所以我想这可以提高效率,但这里是基本理念:
cbind
然后可以{{1}}编辑,如上所示。
答案 2 :(得分:1)
尝试使用gsub替换该字符:
R> str <- "1:2:4"
R> str
[1] "1:2:4"
R> gsub(":", ",", str)
[1] "1,2,4"
确保该列是一个字符串而不是事先的因素。