使用多个分隔符在R中读取和重新整形数据

时间:2014-12-10 01:06:02

标签: r reshape

我有一个大文件(2GB),并希望重塑它如下

输入

o1,o1_1,o1_2|a1,1  
o2,o2_1,o2_2|b1,1|b2,1|b3,2  
o3,o3_1,o3_2|c1,1  

预期输出

o1,o1_1,o1_2,a1,1   
o2,o2_1,o2_2,b1,1  
o2,o2_1,o2_2,b2,1  
o2,o2_1,o2_2,b3,2  
o3,o3_1,o3_2,c1,1  

我在awk中尝试了以下命令,它运行正常。如何在R中有效地做同样的事情?

awk -F\| '{for (i = 2;i<=NF;i++) print $1","$i}'

2 个答案:

答案 0 :(得分:0)

这非常糟糕,但也许你可以使用它。

yourData <- scan("yourData.txt", what="character")
makeData <- function(x){
  l <- sapply(x, strsplit, split="[|]")[[1]]
  if(length(l) == 2)
    return(paste(l[1], collapse=","))
  else
    return(unlist(strsplit(paste(l[1], c(l[2:length(l)]), sep=","), split=" ")))
}

( unlist(sapply(yourData, makeData, USE.NAMES=FALSE)) )
## [1] "o1,o1_1,o1_2"      "o2,o2_1,o2_2,b1,1" "o2,o2_1,o2_2,b2,1" "o2,o2_1,o2_2,b3,2" "o3,o3_1,o3_2"     

如果是我,我可能只是将它包装在系统调用中,并使用参数intern = TRUE将结果存储在内存中。

答案 1 :(得分:0)

您可以从stri_split尝试stringi(会更快)

library(stringi)
library(data.table)
library(reshape2)
v1 <- scan('Ankitdat.txt', what='', quiet=TRUE)
lst <-  stri_split_regex(v1, '[|]')
setkey(setDT(melt(lst)), L1)[,
     list(paste(value[1], value[-1], sep=',')) ,by=L1][,L1:=NULL][]
#                 V1
#1: o1,o1_1,o1_2,a1,1
#2: o2,o2_1,o2_2,b1,1
#3: o2,o2_1,o2_2,b2,1
#4: o2,o2_1,o2_2,b3,2
#5: o3,o3_1,o3_2,c1,1

或者

 unlist(sapply(lst, function(x) paste(x[1], x[-1], sep=",")), use.names=FALSE)
 #[1] "o1,o1_1,o1_2,a1,1" "o2,o2_1,o2_2,b1,1" "o2,o2_1,o2_2,b2,1"
 #[4] "o2,o2_1,o2_2,b3,2" "o3,o3_1,o3_2,c1,1"