从R

时间:2017-03-21 17:34:18

标签: r import average

我的计算机上有一个目录,里面装满了〜1000个.txt文件。每个文件都是这样的(没有NAs):

`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是列M40_A的平均值,行K00844为1.txt和2.txt((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(左,右)中:'+'对因子没有意义。 更不用说,这并不是所有.txts文件的平均值,因为R文档说Reduce是组合给定向量的元素。

所以,我认为必须有一种不同的方式才能使这项工作。任何帮助或洞察如何提出我的final_df都会非常有用!

1 个答案:

答案 0 :(得分:0)

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

这是一个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文件。 HTH