我有两个这样的数据帧:
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?
答案 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.x
和n.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"))