R:如何合并更多2个数据框并添加值?

时间:2019-12-08 14:58:40

标签: r dataframe dplyr

我有两个这样的数据帧:

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

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

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

我正在尝试使用dplyr bind_rows,group_by和count创建数据帧(dat3),但是我做不到。

{{ encore_entry_js_files('sw') }}

我如何制作dat3?

4 个答案:

答案 0 :(得分:1)

data.table是优于dplyr的软件包。我建议您尝试一下:

library(data.table)
dat1 <- setDT(dat1); dat2 <- setDT(dat2)

dat3 <- rbindlist(list(dat1, dat2))[, .(n= sum(n)), .(col)]

答案 1 :(得分:0)

您应该总结而不是计数:

.Rprofile

答案 2 :(得分:0)

第三种选择,以防万一:

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是这里的hack,可能是某些原因那里更好...)

答案 3 :(得分:0)

或者在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"))