当我在
dplyr::summarise()
中使用两个函数时,函数的顺序会影响输出。虽然这篇文章显示当第一个函数影响第二个函数所操作的列时可能会发生这种情况(建议按顺序处理每个函数),但在我的示例中并非如此。
在下面每年 2 行的数据示例中,我计算每年的行数(在
n()
内使用 summarise()
)计算每个变量的缺失值数量。这会产生每年正确的 2 行数。但是,如果我计算之前的行数并计算缺失值,则输出显示每年 0 行。
为什么会产生两种不同的结果?如果确实是因为我忽略了一些顺序处理,那么是否可以使用单个
summarise()
调用中使用的函数之一的输出作为同一调用中使用的另一个函数的输入?
library(dplyr)
# Example data with 2 rows per year
df <- data.frame(var1 = rep(c(NA,NA,5),2),
var2 = rep(c(1,NA,2),2),
year = rep(1:3, 2))
# Approaches to counting number of missing values AND total rows for each year:
# Approach 1: calculate rows per group second, CORRECTLY shows 2 rows per year
df %>%
group_by(year) %>%
summarise(across(everything(), ~ sum(is.na(.x))),
rows_per_year = n())
#> year var1 var2 rows_per_year
#> <int> <int> <int> <int>
#> 1 1 2 0 2
#> 2 2 2 2 2
#> 3 3 0 0 2
# Approach 2: calculate rows per group first, INCORRECTLY shows 0 rows per year
df %>%
group_by(year) %>%
summarise(rows_per_year = n(),
across(everything(), ~ sum(is.na(.x))))
#> year rows_per_year var1 var2
#> <int> <int> <int> <int>
#> 1 1 0 2 0
#> 2 2 0 2 2
#> 3 3 0 0 0
在第二个中,“所有内容”现在包括“rows_per_year”字段。因此,它使用的值基于
sum(is.na(.x))
函数而不是 n()
函数。
一个明显的例子是
df %>%
group_by(year) %>%
summarise(rows_per_year = n(),
rows_per_year = rows_per_year + 1)