【问题标题】:Merging rows in R在 R 中合并行
【发布时间】:2016-07-18 15:55:57
【问题描述】:

我想合并 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 等)制作自己的函数?

【问题讨论】:

  • 这总是左连接吗?或者x 数据框中可能不存在一些值?另外,这些值在实际示例中是factor 还是character 类?
  • 嗨,David,这不仅仅是左连接,X 可能包含 Y 中不存在的数据,反之亦然。连接列可能是一个因素,但所有其他列都是字符串。

标签: r merge aggregate


【解决方案1】:

如果您在 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(不创建新数据集)。

【讨论】:

  • 如果不总是左连接怎么办? x 可能有 y 没有的条目,反之亦然。
  • 另外,我犯了一个错误,像文件一样调用列,我不确定哪个是哪个。
【解决方案2】:

您可以使用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

【讨论】:

  • 我想你没有提到所有使用的包。另外,可能会添加该操作的结果
  • 1) join_all 不是 dplyr 函数。 2)输出创建NA字符串组合inside-r.org/packages/cran/plyr/docs/join_all
  • 感谢您的意见。我将其转换为纯 dplyr 答案。我不得不借用 @David Arenburg 的修改来使用 stringsASFactors。
  • 我在我的 plyr 包中找不到 join_all 函数,知道为什么吗?谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 2014-05-05
  • 2016-09-23
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多