繁体   English   中英

将两个相同的数据帧列合并到R中的逗号分隔列中

[英]Combine two identical dataframe columns into comma seperated columns in R

我有两个结构相同的数据框(相同数量的行,列和相同的标题)。 我想要做的是将两者合并为一个具有逗号分隔列的数据框。

我知道如何使用这些虚拟数据帧,但在我自己的数据上使用它将非常麻烦。

这是我的虚拟数据帧,我的“真实”数据的标题是“1”,“2”,“3”等,而虚拟数据帧的标题是“X1”,“X2”,“X3”等。

> data1
  X1 X2 X3 X4
1  1  2  3  4
2  2  3  4  5
3  3  4  5  6
> data2
  X1 X2 X3 X4
1  8  9 13 14
2  9 10 14 15
3 10 11 15 16

我想要的是什么:

>data3
   new1 new2 new3 new4
 1  1,8  2,9 3,13 4,14
 2  2,9 3,10 4,14 5,15
 3 3,10 4,11 5,15 6,16

我是如何设法得到这个输出的。 但是,对于我认为的大型数据集来说,它太麻烦了。

data1<- data.frame('1'=1:3, '2'=2:4, '3'=3:5,'4'=4:6)
data2<- data.frame('1'=8:10, '2'=9:11, '3'=13:15,'4'=14:16)
names(data1) <- c("1a","2a","3a","4a")
names(data2) <- c("1b","2b","3b","4b")

data3<- cbind(data1,data2)

cols.1 <- c('1a','1b'); cols.2 <-c('2a','2b')
cols.3 <- c('3a','3b'); cols.4 <-c('4a','4b')

data3$new1 <- apply( data3[ , cols.1] , 1 , paste , collapse = "," )
data3$new2 <- apply( data3[ , cols.2] , 1 , paste , collapse = "," )
data3$new3 <- apply( data3[ , cols.3] , 1 , paste , collapse = "," )
data3$new4 <- apply( data3[ , cols.4] , 1 , paste , collapse = "," )

data3 <-data3[,c(9:12)]

有没有办法可以迭代这个,也许有一个for循环? 任何帮助,将不胜感激。

这些帖子有点类似:

相同的问题但是对于行而不是列: 如何将列值转换为逗号分隔的行值

类似,但不适用于我的大型数据集:将多个列粘贴在一起

仅使用基数:

data1 <- data.frame(x1 = 1:3, x2 = 2:4, x3 = 3:5, x4 = 4:6)
data2 <- data.frame(x1 = 8:10, x2 = 9:11, x3 = 13:15, x4 = 14:16)

data3 <- mapply(function(x, y){paste(x,y, sep = ",")}, data1, data2)
data3 <- as.data.frame(data3)

    x1   x2   x3   x4
1  1,8  2,9 3,13 4,14
2  2,9 3,10 4,14 5,15
3 3,10 4,11 5,15 6,16

这是一个基本的for循环方法:

newdf = data.frame(matrix(ncol=ncol(data1),nrow=nrow(data1)))

for (i in 1:ncol(data1)) {
  newdf[,i] = paste(data1[,i], data2[,i], sep=",")
}

#> newdf
#     X1   X2  X3   X4
# 1   1,8  2,9 3,13 4,14
# 2   2,9 3,10 4,14 5,15
# 3  3,10 4,11 5,15 6,16

逐行说明:

初始化适当维度的新空数据框:

newdf = data.frame(matrix(ncol=ncol(data1),nrow=nrow(data1)))

循环遍历1,2,... n列并使用paste结果填充每列:

for (i in 1:ncol(data1)) {
  newdf[,i] = paste(data1[,i], data2[,i], sep=",")
}

免责声明在大型数据集上这可能会非常慢 - 如果您对学习这些方法感兴趣,那么dplyrdata.frame方法(可能还有一些v/s/apply*()语句)会更快。

暂无
暂无

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

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