【问题标题】:Combine two identical dataframe columns into comma seperated columns in R将两个相同的数据框列组合成 R 中的逗号分隔列
【发布时间】:2016-11-08 15:42:53
【问题描述】:

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

我知道如何使用这个虚拟数据帧,但是在我自己的数据上使用它会很麻烦。

这是我的虚拟数据帧,我的“真实”数据的标题是“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 循环?任何帮助将不胜感激。

这些帖子有些相似:

同样的问题,但针对的是行而不是列: how to convert column values into comma seperated row vlaues

类似,但不适用于我的大型数据集: Paste multiple columns together

【问题讨论】:

    标签: r dataframe apply cbind


    【解决方案1】:

    仅使用基础:

    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
    

    【讨论】:

    • 或这样写mapplymapply(paste, data1, data2, MoreArgs = list(sep = ","))
    【解决方案2】:

    这是一个基本的 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*() 语句)会更快。

    【讨论】:

    • 一个不错且简单的方法 :) 它只适用于前 4 列,但第 5 到 33 列填充了 NA 值。我会尝试看看 dplyr 和 data.frame 方法是否给出相同的结果
    • 嗯....它应该适用于任意数量的列。 data1 和 data2 应该是相同的大小,ncol(data1) 应该是 33。不过很难说,因为我不知道你的数据是什么样的。
    • 无论如何,Nathan 的回答更好,除非你真的想使用 for 循环 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 2016-07-16
    相关资源
    最近更新 更多