按组分类,包括中间组

时间:2017-07-06 17:08:44

标签: r

我有:

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

3 个答案:

答案 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,而不是零。我相信你应该把它作为一个缺失的价值来解决这个问题。