【问题标题】:Calculating standard error of the mean from multiple files in a directory in R从R中目录中的多个文件计算平均值的标准误差
【发布时间】:2019-06-28 03:05:43
【问题描述】:

我在一个目录中有多个文本文件(数百个)。每个文本的尺寸为 225 行和 50 列(所有相同的行名和列名)。所有文本文件都是数字,我需要生成一个数据框,该数据框采用所有这些文本文件的每个单元格的平均值的标准误差。

有很多代码可以计算一个主数据框,该主数据框在目录中所有文本文件的每个单元格中具有平均值,但没有用于计算一个主数据框,该主数据框仅显示每个单元格中平均值的标准误差。

例如,这将引入所有文本文件,读取它们,并生成一个主数据框,其中包含每个文本文件的每个单元格的平均值。

txt <- lapply(list.files(pattern = ".txt"), read.delim)
Z <- Reduce("+", txt) / length(txt)

这给出了一个如下所示的数据框:

>head(Z)
      C1   C2  C3 
Row_1 20   22  25
Row_2 14   9   22

但这些是合并到一个数据帧中的所有文本文件的平均值。我希望这是平均值的标准错误,不幸的是我还没有找到可以产生这个结果的帖子。有很多帖子采用一个数据框的列的标准错误,只是没有这么多存储在目录中。

我试过这个,但很不爽。它不起作用:

SE <- Reduce("sd", txt) /sqrt(length(txt)

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: r dataframe standard-error


    【解决方案1】:

    一种选择是unlist,创建一个array 并使用计算标准误差的自定义函数之一

    library(plotrix)
    dim1 <- c(dim(txt[[1]]), length(txt))
    apply(array(unlist(txt), dim1), 1:2, std.error)
    #          [,1]      [,2]     [,3]      [,4]
    #[1,] 1.666667 1.2018504 1.452966 1.7638342
    #[2,] 2.081666 1.5275252 1.527525 2.3333333
    #[3,] 2.027588 0.8819171 1.855921 0.8819171
    

    这也等于 OP 显示的用于计算的函数

    apply(array(unlist(txt), dim1), 1:2,  function(x) sd(x)/sqrt(length(x)))
    #        [,1]      [,2]     [,3]      [,4]
    #[1,] 1.666667 1.2018504 1.452966 1.7638342
    #[2,] 2.081666 1.5275252 1.527525 2.3333333
    #[3,] 2.027588 0.8819171 1.855921 0.8819171
    

    也可以用来计算mean

    Reduce(`+`, txt)/length(txt)
    #        V1       V2       V3       V4
    #1 5.333333 6.333333 5.333333 4.666667
    #2 4.000000 3.000000 4.000000 5.333333
    #3 4.666667 4.666667 6.666667 6.666667
    
    apply(array(unlist(txt), dim1), 1:2, mean)
    #         [,1]     [,2]     [,3]     [,4]
    #[1,] 5.333333 6.333333 5.333333 4.666667
    #[2,] 4.000000 3.000000 4.000000 5.333333
    #[3,] 4.666667 4.666667 6.666667 6.666667
    
    apply(array(unlist(txt), dim1), 2, rowMeans)
    

    数据

    set.seed(24)
    txt <- lapply(1:3, function(i) as.data.frame(matrix(sample(1:9, 3 * 4, 
          replace = TRUE), 3, 4)))
    

    【讨论】:

    • 非常感谢!这很好用!顺便说一句,这用最终数据框中的通用“V1、V2、V3”等替换了我的所有列名。查看我的数据后,我认为这段代码保留了列顺序,所以我可以将它们重命名为与 txt 文件相同的列名(它们都具有相同的列名以相同的顺序)。
    猜你喜欢
    • 1970-01-01
    • 2018-02-01
    • 2020-06-24
    • 2014-03-21
    • 2018-06-18
    • 1970-01-01
    • 2019-12-22
    相关资源
    最近更新 更多