【问题标题】:Error in calculating standard error: (list) object cannot be coerced to type 'double'计算标准误差时出错:(列表)对象不能被强制输入“double”
【发布时间】:2020-02-03 18:12:53
【问题描述】:

我已经使用

计算了每个处理的观察值的平均值
Data %>% group_by(Treatment, Rep) %>% summarise(Mean = mean(Nitrogen, na.rm = TRUE)) 

我对每种治疗都有一个值。现在我想计算平均值的标准偏差和标准误差。我用过的,

Data %>% group_by(Treatment, Rep) %>% summarise_each(funs = mean, sd, se=sd(.)/sqrt(n()), na.rm = TRUE) 

但它给出了一个错误。我不确定我的错误是什么。谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    summarise_each 被弃用,funslist 取代

    library(dplyr)
    Data %>%
       group_by(Treatment) %>%
       summarise_at(vars(-group_cols()), list(mean = ~mean(., na.rm = TRUE), 
                           sd = ~sd(., na.rm = TRUE), 
                           se=~ sd(., na.rm = TRUE)/sqrt(n())))
    

    如果我们不确定列类型,请检查

    str(Data)
    

    并仅将函数应用于数字列。在前面的代码中不做太多改动,将数字列的 summarise_at 替换为 summarise_if

     Data %>%
       group_by(Treatment, Rep) %>%
       summarise_if(is.numeric, list(mean = ~mean(., na.rm = TRUE), 
                           sd = ~sd(., na.rm = TRUE), 
                           se=~ sd(., na.rm = TRUE)/sqrt(n())))
    

    如果某些列具有class factor 并且需要用于mean/sd,则首先将这些列/列转换为numericas.numeric(as.character(Data[[yourcolumn]]))

    可以用iris数据复现

    data(iris)
    iris %>% 
      group_by(Species) %>%
      summarise_at(vars(-group_cols()), list(mean = ~mean(., na.rm = TRUE), 
                            sd = ~sd(., na.rm = TRUE), 
                            se=~ sd(., na.rm = TRUE)/sqrt(n())))
    # A tibble: 3 x 13
    #  Species Sepal.Length_me… Sepal.Width_mean Petal.Length_me… Petal.Width_mean Sepal.Length_sd Sepal.Width_sd Petal.Length_sd
    #  <fct>              <dbl>            <dbl>            <dbl>            <dbl>           <dbl>          <dbl>           <dbl>
    #1 setosa              5.01             3.43             1.46            0.246           0.352          0.379           0.174
    #2 versic…             5.94             2.77             4.26            1.33            0.516          0.314           0.470
    #3 virgin…             6.59             2.97             5.55            2.03            0.636          0.322           0.552
    # … with 5 more variables: Petal.Width_sd <dbl>, Sepal.Length_se <dbl>, Sepal.Width_se <dbl>, Petal.Length_se <dbl>,
    #   Petal.Width_se <dbl>
    

    在OP的帖子中,一些函数具有匿名函数,na.rm = TRUE似乎来自mean(不清楚)。

    【讨论】:

    • @akrun,它适用于一个数据集,但对于另一个数据集,它给出了错误: var(if (is.vector(x) || is.factor(x)) x else as .double(x), na.rm = na.rm) :在因子 x 上调用 var(x) 已失效。使用类似 'all(duplicated(x)[-1L])' 的东西来测试一个常数向量。
    • @Jessica 那是因为mean/sd 等适用于数字列。如果是字符/因子变量,需要先由as.numeric(as.character(columnname))转换成numeric请查看str(Data)
    • @akrun,我明白了,谢谢!但是我为每个 Rep 的每个处理得到了两个平均值。我可以在对所有 Rep 进行平均后得到一个值,因为我想使用平均值来绘制图。
    • @Jessica 我认为您需要将Rep 从 group_by group_by(Treatment, Rep) 删除到 group_by(Treatment)
    • @akrun,我试过了,但 ggplot 仍然出错。
    猜你喜欢
    • 2017-11-01
    • 2016-05-22
    • 2016-09-30
    • 2016-05-24
    • 1970-01-01
    • 2017-08-29
    • 2012-01-17
    • 2019-02-27
    • 1970-01-01
    相关资源
    最近更新 更多