在计算分组统计量之前删除 NA

  • 本文关键字:删除 NA 统计 计算 r
  • 更新时间 :
  • 英文 :


在计算每组变量的标准偏差之前,如何定义NA的删除?我像这样使用 ave((:

df$sd_grade1 <- ave(df$grade1, df$class, FUN = sd)

"等级 1"是一个从 1 到 7 的数字变量,它包含一个 NA 值。我想计算每个班级分组的变量"Grade1"的标准偏差(班级有两组,"数学"和"英语"(。 问题是,如果"等级 1"中有一个 NA 值,并且它在 df$class 中的数学中,则数学标准差的所有值都将成为 NA。 取消分组不是问题,在计算 SD 之前正确删除 NA,如下所示:

df$sd_grade1 <- sd(df$grade1, na.rm = TRUE)

基本上,在计算新变量中每组的标准偏差时,我想省略出现在"等级 1"中的任何 NA。使用 ave(( 和 na.rm = TRUE,我得到一个错误,na.omit = TRUE 不返回错误,但也不做任何事情。如何使用 ave(( 正确定义它?

重现:

df <- data.frame(
grade1 = sample(1:10),
class = sample(c("maths", "english"), 10, replace = TRUE)
)
df$grade1<-car::recode(df$grade1,"3=NA")
# ungrouped, same SD regardless of group and NAs omitted in SD calculation, but this is not something I want.
df$sd_grade1 <- sd(df$grade1, na.rm = TRUE)
# grouped, but na.rm does not work here because "maths" contains one NA.
df$sd_grp_grade1 <- ave(df$grade1, df$class, FUN =  sd, na.rm = TRUE)

通过使用dplyr

library(dplyr)
df %>% group_by(class) %>% summarise(SD = sd(grade1, 
na.rm = TRUE))

输出:

# A tibble: 2 x 2
class      SD
<fct>   <dbl>
1 english  2.63
2 maths    3.65

我很惊讶地发现这一点

ave(df$grade1, df$class, FUN =  sd, na.rm = TRUE)
#[1]   NA 3.35   NA 3.35   NA   NA   NA 3.35 3.35 3.35

如果组中只有一个NA,则返回所有值的NA

然后我更改了函数并检查了sum,令人惊讶的是sum给出了相同的NA值。

ave(df$grade1, df$class, FUN =  sum, na.rm = TRUE)
# [1] NA 31 NA 31 NA NA NA 31 31 31

在仔细查看了ave的文档后,我意识到没有...参数可供FUN传递其他参数。因此,上述尝试中的na.rm = TRUE并没有传递给sdsum.

因此,要传递其他参数,我们需要在ave中使用匿名函数调用

ave(df$grade1, df$class, FUN =  function(x) sd(x, na.rm = TRUE))
#[1] 3.10 3.35 3.10 3.35 3.10 3.10 3.10 3.35 3.35 3.35

它也适用于sum

ave(df$grade1, df$class, FUN = function(x) sum(x, na.rm = TRUE))
#[1] 21 31 21 31 21 21 21 31 31 31

数据

set.seed(589)
df <- data.frame(
grade1 = sample(1:10),
class = sample(c("maths", "english"), 10, replace = TRUE))
df$grade1<-car::recode(df$grade1,"3=NA")

最新更新