【问题标题】:Getting "NA" when I run a standard deviation当我运行标准偏差时得到“NA”
【发布时间】:2011-04-21 04:28:00
【问题描述】:

快速提问。我将 csv 文件读入变量 data。它有一个列标签var,其中有数值。

当我运行命令时

sd(data$var)

我明白了

[1] NA 

而不是我的标准差。

你能帮我弄清楚我做错了什么吗?

【问题讨论】:

    标签: r statistics na stdev


    【解决方案1】:

    尝试sd(data$var, na.rm=TRUE),然后列 var 中的任何 NA 都将被忽略。还需要检查您的数据以确保 NA 应该是 NA 并且没有读取错误,head(data)tail(data)str(data) 等命令应该对此有所帮助。

    【讨论】:

    • 我在您的答案中添加了str(),因为我发现它对此类调试任务很有帮助,但不认为它有必要提供自己的答案。希望您不介意,请随时回滚。
    • summary(data) 可能是查看数据中是否存在NA 的最简单方法。
    • 有时,'is.numeric()' 可能会有所帮助。
    【解决方案2】:

    我曾经一两次在 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.
    

    【讨论】:

    • 我的问题是我将变量命名为“mean”,这在当时似乎是个好主意!我想知道为什么 na.rm=T 不起作用。
    【解决方案3】:

    var 中可能缺少值,或者该列不是数字,或者只有一行。

    尝试删除对第一种情况有帮助的缺失值:

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

    如果这不起作用,请检查

    class(dat$var)
    

    是“数字”(第二种情况)并且

    nrow(dat)
    

    大于 1(第三种情况)。

    最后,data 是 R 中的一个函数,所以最好使用不同的名称,我已经在这里完成了。

    【讨论】:

      【解决方案4】:

      数据中可能有Inf-Inf 作为值。

      试试

      is.finite(data)
      

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

      检查是否确实如此。

      【讨论】:

        猜你喜欢
        • 2019-03-31
        • 1970-01-01
        • 1970-01-01
        • 2018-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多