在dplyr的summarise函数中进行过滤。

16 浏览
0 Comments

在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的均值。

我通常会执行两个单独的命令,然后合并结果,但我想肯定有一种更方便的方法,只是我不明白。

先谢谢。

0
0 Comments

问题出现的原因是在使用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函数进行筛选时出现的错误。

0
0 Comments

问题出现的原因:

问题出现的原因是在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函数,我们可以根据谓词函数选择要汇总的列,从而实现过滤功能。

0
0 Comments

问题的原因是在使用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'))

0