在R DataFrame中设置

时间:2011-08-11 21:36:43

标签: r

我有一个看起来像

的csv
 Deamon,Host,1:2:4,aaa.03
 Pixe,Paradigm,1:3:5,11.us

我需要将其读入数据框进行分析,但我的数据中的第3列用以下内容分隔:并且需要像集合或列表一样读取1.e分割为:以便它返回(1,2,4) )。是否可以在R中包含具有类列表的列。或者你认为我能如何最好地解决这个问题。

3 个答案:

答案 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"

确保该列是一个字符串而不是事先的因素。