我有:
df <- data.frame(group=c(1,1,2,4,4,5), value=c(3,1,5,2,3,6))
aggregate(value ~ group, data = df, FUN = 'sum')
group value
1 1 4
2 2 5
3 4 5
4 5 6
有没有办法包含中间组以返回以下内容?我意识到这可以通过创建一个包含所有所需组的数据框并在aggregate()的结果中匹配来完成,但我希望有一种更简洁的方法来实现这一点。它需要与使用聚合一样快,并且只使用基本r包 - 这是由于我工作场所的限制。
group value
1 1 4
2 2 5
3 3 0
4 4 5
5 5 6
答案 0 :(得分:1)
你可以试试这个。
library(tidyr)
library(dplyr)
df %>%
mutate(group=factor(group, 1:5)) %>%
complete(group) %>%group_by(group)%>%
dplyr::summarise(value=sum(value,na.rm = T))
group value
<fctr> <dbl>
1 1 4
2 2 5
3 3 0
4 4 5
5 5 6
答案 1 :(得分:1)
您可以使用tidyverse
:
library(dplyr)
library(tidyr)
df %>%
group_by(group) %>%
summarise(valuesum = sum(value)) %>%
full_join(., expand(df, group = 1:5)) %>%
complete(group, fill = list(valuesum = 0))
结果:
# A tibble: 5 x 2
group valuesum
<dbl> <dbl>
1 1 4
2 2 5
3 3 0
4 4 5
5 5 6
或者data.table
更难理解:
library(data.table)
setDT(df)[.(group = 1:5), on = 'group', sum(value, na.rm = TRUE), by = .EACHI]
答案 2 :(得分:1)
您可以使用基础R中的merge
。我已将您的data.frame名称更改为dat
,因为df
是R函数的名称。< / p>
dat <- read.table(text = "
group value
1 4
2 5
4 5
5 6
", header = TRUE)
str(dat)
res <- aggregate(value ~ group, data = dat, FUN = 'sum')
merge(res, data.frame(group = seq(from = min(res$group), to = max(res$group))), all = TRUE)
请注意,会有NA
,而不是零。我相信你应该把它作为一个缺失的价值来解决这个问题。