【问题标题】:R: How can i merge more 2 data frames with adding values?R:如何通过添加值合并更多 2 个数据框?
【发布时间】:2019-12-08 14:58:40
【问题描述】:

我得到了两个这样的数据框:

dat1
  col   n
1  A    1
2  B    1
3  C    2


dat2
  col   n
1  A    2
2  B    1
3  C    1
4  D    1

我想用 dat1 和 dat2 制作这样的数据框:

dat3
  col   n
1  A    3
2  B    2
3  C    3
4  D    1

我正在尝试使用 dplyr bind_rows、group_by 和 count 制作数据框 (dat3),但我做不到。

bind_rows(dat1, dat2) %>%
  group_by(col)

result:
  col   n 
1  A    1
2  B    1
3  C    2
4  A    2
5  B    1
6  C    1
7  D    1

bind_rows(dat1, dat2) %>%
  group_by(col) %>%
  count(n)

result:
  col   n   nn
1  A    1    1
2  A    2    1
3  B    1    2
4  C    1    1
5  C    2    1
6  D    1    1

如何制作dat3?

【问题讨论】:

  • 황낙주,如果其中一个答案解决了您的问题,请accept it;这样做不仅为回答者提供了一些积分,而且还为有类似问题的读者提供了一些关闭。尽管您只能接受一个答案,但您可以选择对您认为有帮助的人进行投票。 (如果仍有问题,您可能需要编辑您的问题并提供更多详细信息。)

标签: r dataframe dplyr


【解决方案1】:

你应该总结而不是计数:

bind_rows(dat1, dat2) %>%
  group_by(col) %>% summarise(Sum = sum(n))

# A tibble: 4 x 2
  col     Sum
  <chr> <dbl>
1 A         3
2 B         2
3 C         3
4 D         1

【讨论】:

  • 我只是.. 尝试继续使用'n',这是愚蠢的错误。谢谢你的回答:)
【解决方案2】:

第三个选项,以防万一:

psum <- function(..., na.rm = TRUE) {
  m <- cbind(...)
  apply(m, 1, sum, na.rm = na.rm)
}

full_join(dat1, dat2, by = "col") %>%
  mutate(n = psum(n.x, n.y))
#   col n.x n.y n
# 1   A   1   2 3
# 2   B   1   1 2
# 3   C   2   1 3
# 4   D  NA   1 1

(n.xn.y 列是由连接生成的,由于同名列,它们保留在这里仅用于演示。是的,psum 在这里是一个黑客,可能有更好的东西...... )

【讨论】:

  • 我也尝试了 full_join 并收集。它很容易通过不使用'n'来解决。谢谢你的回答!
【解决方案3】:

或者在base R

aggregate(cbind(Sum = n) ~ col, rbind(df1, df2), FUN = sum)
#   col Sum
#1   A   3
#2   B   2
#3   C   3
#4   D   1

数据

df1 <- structure(list(col = c("A", "B", "C"), n = c(1L, 1L, 2L)), 
    class = "data.frame", row.names = c("1", 
"2", "3"))

df2 <- structure(list(col = c("A", "B", "C", "D"), n = c(2L, 1L, 1L, 
1L)), class = "data.frame", row.names = c("1", "2", "3", "4"))

【讨论】:

    【解决方案4】:

    data.table 是优于dplyr 的软件包。我建议你试试看:

    library(data.table)
    dat1 <- setDT(dat1); dat2 <- setDT(dat2)
    
    dat3 <- rbindlist(list(dat1, dat2))[, .(n= sum(n)), .(col)]
    

    【讨论】:

    • 一个天真的问题,为什么data.table优于dplyr
    • 您的“优越”参考完全是上下文相关的,并且受制于大量意见、经验、需求等。并非所有比较因素都基于计算时间。更进一步:虽然我越来越精通data.table,但它的可读性——尤其是对于新的 R 用户——可能令人生畏。考虑到这个用户似乎刚刚开始使用dplyr,让我们坚持他们“熟悉”的内容。
    • 再次强调,优势是相对的。如果您的意思是更快,是的。如果您的意思是内存高效,当然可以。 (我完全同意这两个方面。)但也有人多次争论它的简洁性既是优点也是缺点,请承认它的语法与基本 R (和其他包)不一致) 会混淆新的 R 用户。它是解决很多问题的正确工具,但不是解决所有问题的完美工具。 (没有什么符合这个要求。)很好的一组链接,顺便说一句,我最近的历史中只有两个 :-)
    • @AlexW 你不需要dat1 &lt;- setDT(dat1),做setDT(dat1)就够了。
    • @r2evans 很高兴我们能在别处进行这次聊天,这样我们就不会分散注意力来回答 OP 的问题。是的,很多人认为dplyr 的可读性是一个强大的附加值。其他人不同意...在语法上,data.tabledplyr 的语法都与基本 R 不同。例如,管道的使用...这个讨论离主题越来越远了。我们要么继续聊天,要么放弃。干杯
    猜你喜欢
    • 1970-01-01
    • 2020-10-19
    • 2012-05-31
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    相关资源
    最近更新 更多