在我的问题中,我提到了data.frame或文件。这意味着,我会接受R和bash的解决方案。让我们来解决问题吧。
我有一个df /文件,它有大约1000列和100000行。我的任务是从这个df /文件中取出一个新文件,其中df1中的两列组合成一列,并由" /"分隔。棘手的是,我想要所有列的这个。为了更清楚,这是一个例子:
df1有10列
a b c d s f r t g g
f j g k r k d a f l
f p j h g i t b k k
h j l u z b g b d h
我想要的是以下内容:df2有5列
a/b c/d s/f r/t g/g
f/j g/k r/k d/a f/l
f/p j/h g/i t/b k/k
h/j l/u z/b g/b d/h
我知道我可以组合两个列,由" /"用功能粘贴。但不幸的是,我无法弄清楚如何在多列中使用它。也许有一个" for循环"?
我可以想象,对于bash,awk是解决方案,但我不知道它是如何正常工作的。因为我有非常大的文件,我猜bash是更快的方式。
先谢谢你的帮助。
最佳, 托比
答案 0 :(得分:3)
你可以尝试
df1 <- df[c(TRUE,FALSE)]
df2 <- df[c(FALSE,TRUE)]
as.data.frame(mapply(paste, df1, df2, sep="/"))
# V1 V3 V5 V7 V9
#1 a/b c/d s/f r/t g/g
#2 f/j g/k r/k d/a f/l
#3 f/p j/h g/i t/b k/k
#4 h/j l/u z/b g/b d/h
或者你可以做到
as.data.frame(`dim<-`(paste(as.matrix(df1),
as.matrix(df2), sep="/"), dim(df1)))
答案 1 :(得分:2)
如果您更喜欢使用文件,可以使用perl:
cat x.txt | perl -ne '$count = 1; s/ /(++$count % 2 == 0)?"\/":$&/ge;print'
为了了解此解决方案的性能,我生成了一个大型数据框:
d <- as.data.frame(matrix(sample(letters,size = 10^3*10^5,replace=T,),ncol=10^5))
将其保存为文本文件,并启动了perl one-liner,我的机器上花了47.5秒。
为了比较,我还评估了akrun解决方案system.time(df3 <- as.data.frame(mapply(paste, df1, df2, sep="/")))
的运行时间,花了210.6秒,即4-5倍。 akrun建议的另一个解决方案,as.data.frame(
dim&lt; - (paste(as.matrix(df1), as.matrix(df2), sep="/"), dim(df1)))
,在59.7秒内完成。