将数据中的两列连接起来。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 秒内完成。
在我的问题中,我提到了 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 秒内完成。