合并R中的行

时间:2016-03-30 14:47:39

标签: r merge aggregate

我想将2个数据框与匹配的列和公共因子合并,但行中的值不同,如下所示:

x <- data.frame(x = c("Uno", "Due", "Tre", "Quattro", "Cinque"), y = c("A", "B", "C", "D", "E"))
           x   y
     1     Uno A
     2     Due B
     3     Tre C
     4 Quattro D
     5  Cinque E

y <- data.frame(x = c("Uno", "Tre", "Cinque"), y = c("F", "G", "H")) 
           x   y
     1     Uno F
     2     Tre G
     3  Cinque H

我希望得到:

       x   y
 1     Uno A, F
 2     Due    B
 3     Tre C, G
 4 Quattro    D
 5  Cinque E, H

许多帖子用聚合和数字合并来解决这个问题,我不知道该怎么做字符串。我是否必须使用函数(x等)创建自己的函数?

2 个答案:

答案 0 :(得分:3)

如果y列中的值是字符而非因素,那么使用data.table

这可能是一项简单的任务
x <- data.frame(x = c("Uno", "Due", "Tre", "Quattro", "Cinque"), 
                y = c("A", "B", "C", "D", "E"),
                stringsAsFactors = FALSE)
y <- data.frame(x = c("Uno", "Tre", "Cinque"), 
                y = c("F", "G", "H"),
                stringsAsFactors = FALSE)

(注意stringsAsFactors = FALSE

然后(假设你总是做左连接)

library(data.table)
setDT(x)[y, y := toString(c(y, i.y)), on = "x", by = .EACHI]
x
#          x    y
# 1:     Uno A, F
# 2:     Due    B
# 3:     Tre C, G
# 4: Quattro    D
# 5:  Cinque E, H

这基本上是动态组合两个数据集中的y列(加入x列时)并更新y(不创建新数据集)。

答案 1 :(得分:1)

您可以使用dplyr

轻松完成此操作
x <- data.frame(x = c("Uno", "Due", "Tre", "Quattro", "Cinque"), y = c("A", "B", "C", "D", "E"), stringsAsFactors = F)

y <- data.frame(x = c("Uno", "Tre", "Cinque"), y = c("F", "G", "H"), stringsAsFactors = F) 


jdf <- full_join(x,y,"x") 

transmute(jdf, x = x, y = ifelse(is.na(y.y),y.x,paste(y.x, y.y, sep=', ')))

 x    y
1     Uno A, F
2     Due    B
3     Tre C, G
4 Quattro    D
5  Cinque E, H