将数据中的两列连接起来。frame/file 将 1000 列连接到新数据中的一列。frame/file

Concatanate two columns in a data.frame/file with 1000 columns to one column in a new data.frame/file

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

我有一个 df/file,它有大约 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

我想要的是:df2 with 5 columns

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 loop"?

我可以想象对于 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 秒。

为了对比,我也评估了ak运行的解决方案system.time(df3 <- as.data.frame(mapply(paste, df1, df2, sep="/")))的运行时间,用了210.6秒,即长了4-5倍。 ak运行、as.data.frame(dim<-(paste(as.matrix(df1), as.matrix(df2), sep="/"), dim(df1))) 建议的另一个解决方案在 59.7 秒内完成。