在 dplyr 中使用 group_by() 和 summarise() 时,sd 函数 returns NA(df 中没有 NA 值)

sd function returns NA when using group_by() and summarise() in dplyr (no NA values in df)

我有一个带有二进制数字响应变量(0 或 1)和几个响应变量的 df。我正在尝试创建一个按类型(3 级变量)和步骤(7 级)分组的 table。我想要每一步每种类型的平均响应和标准差。输出 table 应该有 21 行和 4 个变量:type、step、mean 和 sd。

我的代码如下所示:

data <- data %>% group_by(step, type) %>% summarise(Response = mean(Response), dev = sd(Response))  

输出 table 正确生成平均值,但 returns NA 用于所有 sd 值。我尝试使用 'na.rm=TRUE' 删除 NA 值,但原始 df 中没有任何响应。有什么想法吗?

来自?sd

The standard deviation of a length-one or zero-length vector is ‘NA’.

您的 dplyr 查询很可能导致长度为 1 或长度为 0 的输出。

以下应该会如您所愿:

data <- data %>% group_by(step, type) %>% summarise(Response_mean = mean(Response), dev = sd(Response))  

如前所述,您得到 NA 的原因是您向 sd() 输入了一个值。

但是, 发生的原因与代码中事情发生的顺序有关。您的代码中的以下部分:

summarise(Response = mean(Response)

正在您的新 table 中创建一个名为 'Response' 的变量,其中包含一个值 - 原始数据中向量 'Response' 的平均值。以下部分:

dev = sd(Response)

尝试计算该单个值的标准偏差。

为了说明,你也可以试试这个:

data <- data %>% group_by(step, type) %>% summarise(Response = mean(Response), Response_plus_10 = Response + 10)  

希望这能澄清问题。