我觉得这个问题已经被问过好几次了,但是我无法使其运行。不知道为什么。
我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
答案 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