在dplyr的summarise函数中进行过滤。
在dplyr的summarise函数中进行过滤。
我对
我想计算值的均值,同时计算另一列中具有特定值的值的均值。
库(dplyr)
随机种子(1234)
df <- 数据.frame(id=rep(1:10, each=14),
tp=letters[1:14],
value_type=sample(LETTERS[1:3], 140, replace=TRUE),
values=runif(140))
df %>%
按id,tp分组 %>%
总结(
all_mean=mean(values),
A_mean=mean(values), # 仅对value_type为A的值
value_count=sum(value_type == 'A')
)
所以,A_mean列应计算value_count == 'A'时values的均值。
我通常会执行两个单独的命令,然后合并结果,但我想肯定有一种更方便的方法,只是我不明白。
先谢谢。
问题出现的原因是在使用dplyr的summarise函数时,想要在函数内部进行筛选操作,即根据条件筛选出特定的数据进行汇总计算。然而,在summarise函数中直接使用filter函数进行筛选会出现错误。
解决方法是在summarise函数内部使用逻辑运算符来实现筛选操作。具体的做法是先计算出需要筛选的变量,然后使用逻辑运算符将其与条件进行比较,得到一个逻辑向量,再将该向量作为参数传递给summarise函数中的其他计算操作。这样就可以在summarise函数内部实现筛选操作。
具体的代码如下:
df %>% group_by(id, tp, value_type) %>% summarise(A_mean = mean(values)) %>% summarise(all_mean = mean(A_mean), A_mean = sum(A_mean * (value_type == "A")), value_count = sum(value_type == "A"))
上述代码中,首先使用group_by函数对数据进行分组,然后使用summarise函数计算每个组内的均值。接着,使用summarise函数计算所有组的均值、满足条件"value_type == "A""时的均值以及满足条件"value_type == "A""的数量。其中,通过将条件"value_type == "A""与A_mean进行逐元素相乘,得到一个逻辑向量,然后使用sum函数对该向量进行求和,即可得到满足条件的数量。
通过这种方式,在summarise函数内部实现了筛选操作,解决了在summarise函数中直接使用filter函数进行筛选时出现的错误。
问题出现的原因:
问题出现的原因是在dplyr的summarise函数中,过滤数据的功能与汇总数据的功能是分开的,没有一个直接的方法可以在summarise函数内部进行过滤。
解决方法:
解决方法是使用summarise_if函数,它是dplyr中的一个函数家族(function family)中的一员。summarise_if函数可以根据一个谓词函数(predicate function)来选择要进行汇总的列。谓词函数是一个返回TRUE或FALSE的函数,用于确定要汇总的列的子集。
下面是一个示例代码,演示了如何使用summarise_if函数对数值列进行均值计算:
starwars %>% summarise_if(is.numeric, mean, na.rm = TRUE)
在这个示例中,is.numeric是谓词函数,用于判断哪些列是数值列。mean是用于计算均值的函数。na.rm = TRUE表示在计算均值时忽略缺失值。
运行以上代码后,将得到一个包含三列的tibble,分别是height、mass和birth_year,它们的值分别是身高的均值、体重的均值和出生年份的均值。
通过这种方式,我们可以在summarise函数内部进行过滤,只对符合特定条件的列进行汇总操作。这大大提高了代码的简洁性和可读性。
以上就是在summarise函数中进行过滤的问题的出现原因和解决方法。通过使用summarise_if函数,我们可以根据谓词函数选择要汇总的列,从而实现过滤功能。
问题的原因是在使用dplyr的summarise函数时,如果不明确过滤掉NA值,它们将被包含在计算中。解决方法是在过滤变量可能包含NA的地方使用!is.na()
函数来排除NA值,或者可以在管道的开头使用drop_na()
函数来删除NA值。具体代码如下:
df %>% drop_na(value_type) %>% group_by(id, tp) %>% summarise(all_mean = mean(values), A_mean = mean(values[value_type=="A" & !is.na(value_type)]), value_count = sum(value_type == 'A'))