计算不同文件的平均单元格值

时间:2018-06-14 16:24:50

标签: python r file

大约50000个非结构化文本文件,其中包含大约100万个值(所有数字),我需要计算每个单元格的平均值,即所有50.000个文件的平均值。

文件的结构例如是

4.7  3.9  5.9  6.2  6.6   6.6   6.5  4.7  5.5  11.2 
21.9 12.4  5.6  4.5  5.8  6.7  5.4 3.6 3.9 0.7 0.8

我需要对每个单元格位置的所有文件的均值。

因此,例如,我需要文本文件中所有第一个元素的均值,超过所有50.000个文本文件(但不仅是第一个元素,而是所有元素)。

如何在R或Python中执行此操作?

编辑:附加示例(非常简化) enter image description here

我想根据file1,file 2和file 3中的单元格值计算新文件(MEAN)中的平均值,如下面的链接所示。但是,它应该是一个自动脚本,因为它不是3但每个文件中有50.000个文件和许多100万个值。

3 个答案:

答案 0 :(得分:2)

在python中,我建议一个简单的方法,希望我能帮到你 您可以获取所有文件,然后迭代它们以便将所有空格分隔的数字放入列表中。所有这些列表将存储在另一个列表中,以矩阵形式进行转换,易于管理numpy 在这里,我向您展示一个例子。

  • 0.将所有文件放在同一目录中,例如fdir
  • 1.获取所有文件名

    import os
    flist = os.listdir(fdir)
    

  • 2.现在遍历文件列表。假设文件中格式化的位置并不重要,只是顺序序列(即第一,第二,......不是左上角,右上角......)。

    import numpy as np
    numbers = [] #list of files numbers lists
    for text in flist:
    with open(filename,'r') as f:
           ftext = f.read().split() #the file has only space-separated numbers 
           ftext = [float(n) for n in ftext]
           numbers.append(  np.array( ftext ) )
    

  • 4.转换矩阵

    中的列表列表
    numbers = np.vstack(numbers)
    

  • 5.做你的操作..
    示例:对每个文件的第一个单元求和,意味着对后一个矩阵的第一列求和,所以:

    sum_over_first_cells = np.sum( numbers[:,0] )
    

  • 希望它会有所帮助。

    答案 1 :(得分:1)

    如果文件具有完全相同的结构,则可以在数组中加载一个文件,然后加载另一个文件并求和到该第一个数组。最后,您只需将数组除以文件数。

    示例:

    File 1:
    1 2 3 4 5
    
    File 2:
    5 4 3 2 1
    
    File 3:
    0 3 0 3 0
    

    读取文件1

    Array = {1,2,3,4,5}
    

    阅读并总结文件2

    Array = {1+5, 2+4, 3+3, 4+2, 5+1} = {6, 6, 6, 6, 6}
    

    阅读并总结文件3

    Array = {6+0, 6+3, 6+0, 6+3, 6+0} = {6, 9, 6, 9, 6}
    

    最后,您将数组除以文件数(此处有3个文件)

    Result = {6/3, 9/3, 6/3, 9/3, 6/3} = {2,3,2,3,2}
    

    答案 2 :(得分:0)

    一种选择是使用scan读取所有文件。然后使用stack将数据合并到一个data.frame中。首先在对文件编号分组数据后分配position(单元编号)。然后在position上进行分组,使用mean为每个排名计算dplyr

    librar(dplry)
    
    #Read all files. It will generate a list with vector of values for each file
    myfiles = lapply(list.files(path="D:\\data\\", pattern="*.txt", full.names = TRUE), 
                                                                    scan)
    
    # Name list sequentially. Name will help to `stack`
    names(myfiles) <- seq_along(myfiles)
    
    # stack will generate a merge data.frame
    stack(myfiles) %>% group_by(ind) %>%
      mutate(position = row_number()) %>%
      group_by(position) %>%
      summarise(mean = mean(values,  na.rm = TRUE))
    
    # # A tibble: 55 x 2
    #   position  mean
    #  <int> <dbl>
    # 1        1  16.2 
    # 2        2  9.57
    # 3        3  5.70
    # 4        4  5.07
    # 5        5  6.07
    # 6        6  6.67
    # 7        7  5.77
    # 8        8  3.97
    # 9        9  4.43
    # 10       10  4.20
    # # ... with 45 more rows
    

    数据:

    # File1.txt
    4.7  3.9  5.9  6.2  6.6   6.6   6.5  4.7  5.5  11.2 
    
    # File2.txt
    21.9 12.4  5.6  4.5  5.8  6.7  5.4 3.6 3.9 0.7 0.8 
    
    # File3.txt
    21.9 12.4  5.6  4.5  5.8  6.7  5.4 3.6 3.9 0.7 0.8 21.9 12.4  5.6  4.5 
    5.8  6.7  5.4 3.6 3.9 0.7 0.8 21.9 12.4  5.6  4.5  5.8  6.7  5.4 3.6
    3.9 0.7 0.8 21.9 12.4  5.6  4.5  5.8  6.7 5.4 3.6 3.9 0.7 0.8 21.9 
    12.4  5.6  4.5  5.8  6.7  5.4 3.6 3.9 0.7 0.8