尝试根据之前的分组有条件地求和。难以想出来。
在尝试按f分组时,我试图根据r1类型中的哪些列来汇总amt列。
可重复的代码:
s <- sample(c('one', 'two'), 96, replace = TRUE)
f <- sample(c('a','s','d','f'), 96, replace = TRUE)
r1_amt <- runif(96, 1, 100)
r2_amt <- runif(96, 1, 100)
r3_amt <- runif(96, 1, 100)
x <- data_frame(s, f, r1_amt, r2_amt, r3_amt)
smy <- x %>%
group_by(f) %>%
summarise(n = n(), # population in each f group
num_r1 = sum(r1_amt >= 50)) # amount of r1 in each f group
我已尝试过.[r1_amt >= 50]$amt
,cumsum(r1_amt >= 50)
,sum(ifelse(r1_amt >= 50, r1_amt, 0))
但未能提出分组数字。
因此,给定的行可以是r1为60,r2为40,r3为55,如果有意义,它应该只包含在r1和r3的总和量列中。
答案 0 :(得分:1)
这也许可以采用更清洁的方式,但这应该有效:
x.v2 <- x # temp variable
x.v2[which(x[,4] != 'r1'),3] <- 0 # replace values of tpe != 'r1' with 0's
smy <- x.v2 %>%
group_by(f) %>%
summarise(n = n(), # population in each f group
num_r1 = sum(amt)) # sum of values for type == 'r1' in each group f
rm(x.v2) # remove temp variable
smy # output for seed = 123 (use set.seed(123) for building data)
# f n num_r1
# 1 a 20 114.1879
# 2 d 28 611.9858
# 3 f 19 351.5366
# 4 s 29 357.8402
答案 1 :(得分:1)
听起来你想要做的只是用f和type分组来计算per-f /类型的统计数据。
x %>% group_by(f, type) %>% summarise(num_type=n(), sum_type=sum(amt))
Source: local data frame [16 x 4]
Groups: f [?]
f type num_type sum_type
<chr> <chr> <int> <dbl>
1 a r1 12 616.6610
2 a r2 6 417.5589
3 a r3 9 375.2246
4 a r4 7 346.5796
5 d r1 8 471.1253
...
您可以使用tidyr
返回sum_type
字段的宽格式,但我只会出于显示目的:
> res %>% spread(type, sum_amt)
Source: local data frame [12 x 6]
Groups: f [4]
f num_type r1 r2 r3 r4
* <chr> <int> <dbl> <dbl> <dbl> <dbl>
1 a 6 NA 417.5589 NA NA
2 a 7 NA NA NA 346.5796
3 a 9 NA NA 375.2246 NA
...