【问题标题】:Taking average from multiple text files in R从 R 中的多个文本文件中取平均值
【发布时间】:2017-08-13 13:05:42
【问题描述】:

我的计算机上有一个目录,里面有大约 1000 个 .txt 文件。每个文件看起来像这样(没有 NA):

`head` 1.txt
        M40_A  M40_B   M40_C   M41
K00844  28     20      27      23
K00845  668    649     737     838
K01810  2171   2264    2140    2221

`head` 2.txt
        M40_A  M40_B   M40_C   M41
K00844  23     21      22      11
K00845  649    628     708     837
K01810  2121   2326    2162    2255

对于每个文件,所有行名和列名都相同。我要做的是:创建 1 个最终数据帧,在其中我为每个条件(M40_A、M40_B、M40C、M41)的每个 K00XXX 数字(来自所有 .txt 文件)计算平均值(四舍五入)。例如,我的最终 df 如下所示:

`final_df`
        M40_A  M40_B   M40_C   M41
K00844  26     21      25      17
K00845  659    639     723     838
K01810  2146   2295    2151    2238

其中,例如,值 26 是 1.txt 和 2.txt 的 M40_A 列、K00844 行的平均值 ((28 + 23)/2 = 26)。我已经搜索了这个网站,并在这里找到了完全相同的帖子: Average multiple csv files into 1 averaged file in r 然而,我多次尝试执行代码时不断给我错误。例如:

`txts <- lapply(list.files(pattern="*.txt"), read.csv)'

将我所有的文件读入一个列表,读入一个奇怪的配置。这是我的结果:

`> txts[1]`

[[1] M40_A.M40_B.M40_C.M41
1 K00844\t28\t20\t27\t23\
2 K00845\t668\t649\t737\t838\
3 K01810\t2171\t2264\t2140\t2221\

当我执行第二个代码时:

`Reduce("+", txts) / length(txts)

它给了我:警告信息: 在 Ops.factor(left, right) 中:“+”对因子没有意义。 更不用说,这并没有取所有 .txts 文件的平均值,因为 R 文档说Reduce 是组合给定向量的元素。

所以,我认为必须有一种不同的方法才能完成这项工作。任何有关如何提出我的final_df 的帮助或见解都会非常有帮助!

【问题讨论】:

  • 也许可以试试txts &lt;- lapply(list.files(pattern="*.txt"), read.csv, sep="\t")。此外,您还可以使用 str(txt[[1]]) 来查看数据的内容/结构。

标签: r import average


【解决方案1】:

嗯,这显然不是你想要的,但它可能是你需要的:

这是一个提供您请求的输出的 python 程序:

import sys

allfiledata = []
filenames = sys.argv[1:]
for filename in filenames:
  rows = []
  with open (filename, "r") as filehandle:
    for line in filehandle:
      rows.append( line.split() )

    allfiledata.append( rows ) 


print " ".join(allfiledata[0][0])  # column headers
for i1,columns in enumerate(allfiledata[0][1:]):
  print columns[0],
  for i2,value in enumerate(columns[1:]):
    total = 0 
    for filedata in allfiledata:
      total = int(filedata[i1+1][i2+1]) + total
    print int(float(total)/len(allfiledata)+0.5), 
  print

您可以按如下方式执行它(假设您将其放入一个名为 avg.py 的文件):

python avg.py *.txt

上述命令将平均当前目录中的所有 *.txt 文件。 高温

【讨论】:

  • 马克:效果很好!!会的。非常感谢您编写这段代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 2020-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-05
  • 1970-01-01
相关资源
最近更新 更多