繁体   English   中英

将data.frame / file中的两列与1000列合并为新data.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 /文件,大约有1000列和100000行。 我的任务是从此df / file中删除一个新文件,其中df1中的两列合并为一列,并用“ /”分隔。 棘手的是,我希望所有列都使用此功能。 为了更加清楚,下面是一个示例:

带有10列的df1

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

我想要的是以下内容:5列的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是更快的方法。

在此先感谢您的帮助。

最好,Tobi

你可以试试

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="/")))的运行时间。time system.time(df3 <- as.data.frame(mapply(paste, df1, df2, sep="/"))) ,它花费了210.6秒,即延长4-5倍。 akrun建议的另一种解决方案,如as.data.frame( dim <- (paste(as.matrix(df1), as.matrix(df2), sep="/"), dim(df1))) 59.7秒。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM