r语言 - 将具有 1000 列的 data.frame/file 中的两列连接到新 data.frame/file 中的一



在我的问题中,我提到了data.frame或file。这意味着,我会接受 R 和 bash 的解决方案。让我们来谈谈我的问题。

我有一个 df/文件,大约有 1000 列和 100000 行。我的任务是从这个 df/file 中取出一个新文件,其中 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

我想要的是以下内容:带有 2 列的 df2

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 是更快的方法。

提前感谢您对我的帮助。

最好托比

你可以

试试

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)))

如果你更喜欢使用文件,你可以使用 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单行代码,在我的机器上花了47.5秒。

为了进行比较,我还评估了 akrun 解system.time(df3 <- as.data.frame(mapply(paste, df1, df2, sep="/")))的运行时间,它花了 210.6 秒,即长 4-5 倍。akrun提出的另一种解决方案,as.data.frame(昏暗<(paste(as.matrix(df1), as.matrix(df2), sep="/"), dim(df1))),在59.7秒内完成。>

最新更新