我的计算机上有一个目录,里面装满了〜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
都会非常有用!
答案 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