【问题标题】:conditional summarising/mutate in dplyrdplyr 中的条件汇总/变异
【发布时间】:2017-12-30 11:13:17
【问题描述】:

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

在按 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 &gt;= 50]$amtcumsum(r1_amt &gt;= 50)sum(ifelse(r1_amt &gt;= 50, r1_amt, 0)),但无法得出分组数字。

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

【问题讨论】:

  • 你的预期输出是什么?
  • 我调整了可重现的示例,因为我做得不太正确。如果 r1_amt 中有超过 50 个,我想将给定的观察分类为 r1。然后 sum_r1_amt 列应该是 r1_amt 的总和,前提是观察值高于 50。
  • @MattW。如果您想更改您的问题,请询问另一个问题作为跟进。 16 小时后回来编辑您的问题是不专业的。修改我的答案以解决您的新问题并不难,但我会把它留给您,或者,也许,其他答案。
  • 为了使您的代码可重现,请考虑在开头使用set.seed(10),以便我们在重现时得到相同的答案。更好的是让示例足够简单,以便您可以手动计算答案是什么,以便更容易理解所需的输出是什么。

标签: r dataframe dplyr grouping summarize


【解决方案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
...

【讨论】:

  • 你绝对是对的。我意识到我并没有真正正确地创建可重现的示例,因为分组最有意义。让我编辑澄清一下
【解决方案2】:

这也可能以更简洁的方式实现,但这应该可以:

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

【讨论】:

    猜你喜欢
    • 2018-10-06
    • 1970-01-01
    • 2019-03-06
    • 2016-02-07
    • 1970-01-01
    • 2018-10-22
    • 2017-06-02
    • 2016-04-08
    • 2016-12-30
    相关资源
    最近更新 更多