我有一个大文件(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}'
答案 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"