1

尝试根据之前的分组有条件地求和。很难想出它。

在按 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))但无法得出分组的数字。

因此,给定的 1 行对于 r1 可能是 60,对于 r2 可能是 40,对于 r3 可能是 55,如果有意义的话,它应该仅包含在 r1 和 r3 的总和列中。

4

2 回答 2

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
于 2017-07-24T18:50:28.770 回答
1

听起来您想要做的只是按 f 和 type 分组来计算 per-f/type 统计信息。

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
...
于 2017-07-24T18:56:19.050 回答