【问题标题】:Accessing grouped subset in dplyr访问 dplyr 中的分组子集
【发布时间】:2018-08-17 08:51:23
【问题描述】:

我感觉这已经被问了好几次了,但我无法让它运行在我的案例中。不知道为什么。

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

【问题讨论】:

  • 使用n() 计算子组中的行数。 . 指的是管道输入,即整个数据集
  • 您可以使用do():在其中,. 将引用子集数据框。参见例如stackoverflow.com/questions/48182815/…
  • 那么我怎样才能访问子集而不是输入呢?还是我需要按highlight 分组并用. %&gt;% group_by(exp) %&gt;% summarise(mean=mean(int)) 计算平均值?
  • 你可以这样做:ratio_mean = int[highlight]/mean
  • Ahhhhhh,不知怎的,我还没有看到这个! :-)

标签: r dplyr


【解决方案1】:

这行得通:

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

【讨论】:

  • 谢谢,不知怎的,我没有意识到,在摘要中,我可以直接评估列... :-) 也许是今天早些时候 ;-)
猜你喜欢
  • 2014-05-07
  • 2017-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
  • 2020-12-04
  • 2017-12-26
相关资源
最近更新 更多