在计算每组变量的标准偏差之前,如何定义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
并没有传递给sd
和sum
.
因此,要传递其他参数,我们需要在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")