访问dplyr中的分组子集

时间:2018-08-17 08:51:24

标签: r dplyr

我觉得这个问题已经被问过好几次了,但是我无法使其运行。不知道为什么。

group_by我的数据帧,并从值中计算出mean。另外,我标记了特定的行,我想用子集的突出显示行的值来计算新计算的mean的比率。

library(dplyr)
df <- data.frame(int=c(5:1,4:1),
                 highlight=c(T,F,F,F,F,F,T,F,F),
                 exp=c('a','a','a','a','a','b','b','b','b'))

df %>%
  group_by(exp) %>%
  summarise(mean=mean(int),
            l1=nrow(.),
            ratio_mean=.[.$highlight, 'int']/mean)

但是由于某些原因,.不是group_by的子集,而是完整的输入。我在这里想念东西吗?

我的预期输出将是

exp    mean ratio_mean
  <fct> <dbl>      <dbl>
1 a       3         1.67
2 b       2.5       1.2

1 个答案:

答案 0 :(得分:3)

这有效:

df %>%
  group_by(exp) %>%
  summarise(mean = mean(int),
            l1 = n(),
            ratio_mean = int[highlight] / mean)

但是您的解决方案出了什么问题?

  • nrow(.)计算整个输入数据帧的行数,而n()仅计算每组的行数
  • .[.$highlight, 'int']/mean在这里,您再次使用高亮列使用整个输入数据帧和子集,但是将其除以正确的组均值。实际上,您在这里返回两个值,因为原始df的两行都有一个highlight = TRUE。这会导致讨厌的NA列名。

要保存它,我们可以按照@MikkoMarttila的建议使用do(),但这有点笨拙:

df %>% 
  group_by(exp) %>% 
  do(summarise(., mean = mean(.$int),
               l1 = nrow(.),
               ratio_mean = .$int[.$highlight] / mean))

原始输出

df %>%
  group_by(exp) %>%
  summarise(mean=mean(int),
            l1=nrow(.),
            ratio_mean=.[.$highlight, 'int']/mean)

# A tibble: 2 x 4
#   exp    mean    l1 ratio_mean$    NA
#   <fct> <dbl> <int>       <dbl> <dbl>
# 1 a       3       9        1.67   2  
# 2 b       2.5     9        1      1.2