运行标准差时得到“NA”

17

简短的问题。我把我的csv文件读入到变量data中。它有一个列标签var,其中包含数字值。

当我运行以下命令时:

sd(data$var)

我获得

[1] NA 

我想使用标准差,而不是我的平均偏差。

你能帮我找出问题在哪里吗?

4个回答

34

尝试使用 sd(data$var, na.rm=TRUE) ,然后列 var 中的任何 NAs 都将被忽略。还应检查数据以确保 NA 是 NA,而不是读入错误,像 head(data)tail(data)str(data) 这样的命令可以帮助实现这一点。


3
我在你的回答中加入了 str(),因为我发现它对于这些调试任务很有帮助,但我觉得这并不值得另外写一篇答案。希望你不介意,如果需要可以回滚。 - Chase
2
summary(data)可能是最简单的方法来查看数据中是否存在NA - Gavin Simpson
1
有时,'is.numeric()'可能会有所帮助。 - Manoel Galdino

12

我犯过几次错误,即在 dplyr 的字符串中重复使用变量名,这导致了问题。

mtcars %>%
  group_by(gear) %>%
  mutate(ave = mean(hp)) %>%
  ungroup() %>%
  group_by(cyl) %>%
  summarise(med = median(ave),
            ave = mean(ave), # should've named this variable something different
            sd = sd(ave)) # this is the sd of my newly created variable "ave", not the original one.

1
我的问题是我给变量命名为“mean”,当时似乎是个好主意!我在想为什么na.rm=T不起作用。 - roberty boberty

6

您的 var 可能存在缺失值,或该列不是数字,或只有一行。

尝试移除缺失值可以解决第一个问题:

sd(dat$var, na.rm = TRUE)

如果那不起作用,请检查
class(dat$var)

是“numeric”(第二种情况),

并且
nrow(dat)

大于1(第三种情况)。

最后,data是R语言中的一个函数,因此最好使用不同的名称,这里我已经更改了名称。


0

数据中可能存在Inf-Inf作为值。

尝试

is.finite(data)

或者

min(data, na.rm = TRUE)
max(data, na.rm = TRUE)

来检查是否确实如此。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接