将data.frame / file中的两列连接到一个新data.frame / file中的1000列到一列

时间:2015-01-23 15:47:54

标签: r bash function awk paste

在我的问题中,我提到了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是更快的方式。

先谢谢你的帮助。

最佳, 托比

2 个答案:

答案 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秒内完成。

相关问题