循环遍历数据集列并计算R中的统计信息

循环遍历数据集列并计算R中的统计信息,r,R,我只是从R开始,需要帮助循环数据集和计算统计数据 我有两个数据集: >head(windows) W1 W1 W2 W2 W3 W4 W4 W5 ... >head(values) # this is very large file (>20Gb) Case1 Case2 Case3 Case4 ... 21 19 14 64 14 24 48 13 21 34

我只是从R开始,需要帮助循环数据集和计算统计数据

我有两个数据集:

>head(windows)
W1
W1
W2
W2
W3
W4
W4
W5 
...

>head(values) # this is very large file (>20Gb)
Case1   Case2   Case3   Case4   ... 
   21      19      14      64
   14      24      48      13
   21      34      65      83
   45      53      25      63
   62      32      72      11
   24      75      12      66
   12      23      73      37
   45      23      56      74
   ...
我该做什么:

For cases in values
   join row by row with windows
   For every window
     Calculate mean
   end
end  
  • 对于
    值中的每个
    案例
    将其与
    窗口
    逐行连接; 应该是这样的(
    Case1
    ):

    W121

    W114

    W2 21

    W2 45

    W3 62

    W4 24

    W4 12

    W5 45

  • 对于每个加入的
    窗口
    组,例如:

    • W1(案例1):21,14
    • W2(案例1):21,45
    • W3(案例1):62
    • W4(案例1):24,12
    • W5(案例1):45
    • W1(案例2):19,24
    计算平均值(或中位数)

  • 完美输出如下所示:

        Case1   Case2   Case3   Case4
    W1  17.50   21.50   mean    mean
    W2  33.00   mean    mean    mean    
    W3  62.00   mean    mean    mean
    W4  18.00   mean    mean    mean
    W5  45.00   mean    mean    mean
    
    伪代码可能是:

    For cases in values
       join row by row with windows
       For every window
         Calculate mean
       end
    end  
    

    注意:我已尝试使用
    rbind
    merge
    data.frame
    windows
    值连接起来,但数据集太大,进程被终止

    由于您有一个相当大的数据文件,我认为有两个很好的选择,使用
    data.table
    dplyr
    。下面是使用
    dplyr
    的方法

    但首先,我认为您并不是真的想要
    合并
    窗口
    。根据您的描述,我认为您要做的是添加
    windows
    ,作为
    值的附加列(因为似乎没有可以合并的内容)

    因此,我首先在
    values
    中创建该附加列。(我在这里假设,
    windows
    是一个向量,虽然您的问题不清楚,但它也可能是一个data.frame,但您可以在这种情况下执行非常类似的操作):

    方法2: 使用
    summary_each
    对所有列执行相同的操作,分组变量除外(本例中为窗口)。如果要对大量列执行相同的操作,这样可以节省键入的时间。另外,如果需要,可以指定更多要计算的函数,例如平均值和中值

    library(dplyr)   # if it's not yet loaded
    
    values %>%
      group_by(windows) %>%
      summarise_each(funs(mean(., na.rm=TRUE)))
    
    两种情况下的结果相同:

    #  windows Case1 Case2 Case3 Case4
    #1      W1  17.5  21.5  31.0  38.5
    #2      W2  33.0  43.5  45.0  73.0
    #3      W3  62.0  32.0  72.0  11.0
    #4      W4  18.0  49.0  42.5  51.5
    #5      W5  45.0  23.0  56.0  74.0
    
    编辑 下面是一个示例,其中包含大量样本数据,包括从矩阵到data.frame/vector的转换。如果从“big.matrix”到“matrix”的转换是有效的,那么我认为,这应该与原始数据的工作方式相同

    # create a matrix with 100 columns and 5 million rows for per column
    m <- matrix(runif(100*5e6), ncol=100)
    
    dim(m)
    #[1] 5000000     100
    
    object.size(m)
    # 4000000200 bytes
    
    # convert to data.frame
    df <- as.data.frame(m)
    
    # create a second matrix "windows" with a single column
    windows <- matrix(sample(1:1000, nrow(df), replace=TRUE), ncol = 1)
    
    # convert matrix "windows" to vector
    windows.vec <- as.vector(windows[,1])
    
    # add windows.vec as a grouping variable to "df"
    df$windows <- windows.vec # you could also do this directly from the "windows" matrix
    
    # check dimensions of "df"
    dim(df)
    #[1] 5000000     101
    
    # now you can do the calculation
    df %>%
      group_by(windows) %>%
      summarise_each(funs(mean(., na.rm=T), median(., na.rm=TRUE)))
    
    #创建一个矩阵,每列包含100列和500万行
    
    m这绝不是最优雅的解决方案,但它似乎只需将
    数据堆叠到一列中,然后使用一个tapply()函数即可实现您想要的功能。它还可以防止将
    窗口
    因子和
    数据绑定在一起

    首先,一个小样本数据集,类似于上述格式:

    > set.seed(42)
    
    > values <- data.frame(replicate(4, sample(1:100, 1e3, replace=T)))
    
    > head(values)
             [,1] [,2] [,3] [,4]
    [1,]   85   34   42   77
    [2,]   21    3   72   66
    [3,]   36   45   77   14
    [4,]   78   50    7   31
    [5,]   51   89   42   92
    [6,]   61   23   55    2
    
    > windows <- rep(1:(1e3/2), each=2)
    
    > head(windows)
    [1] 1 1 2 2 3 3
    
    并重复windows值以匹配堆叠数据帧的长度:

    > windows <- rep(windows, 4)
    
    样本输出:

          1    2    3  ...
    X1 50.0 81.5 39.5
    X2 36.0 26.5 52.5
    X3 68.5 77.5 85.5
    X4 52.0 90.0 91.5 
    

    看看“data.table”包。谢谢您的回答,但是在运行
    values时,$windows是
    windows
    vector还是data.frame?它的长度(如果是向量)或行数和列数(如果是data.frame)是多少,
    值有多少行和列?
    dim(values)=5838178 192
    值是
    矩阵
    ;windows是
    matrix
    nrow=5838178
    哦,好的,我以为我们在谈论data.frames。在这种情况下,矩阵的困难在于它们只能存储一种类型的值(例如,只能存储数字或字符)。和
    dplyr
    仅适用于data.frames/data.tables(非矩阵)。在运行我的答案中的代码之前,您可以尝试以下操作:
    values.df顺便问一下,这两个对象是如何创建的?为了避免转换,最好首先直接将它们创建为data.frames。
    
    > windows <- rep(windows, 4)
    
    > tapply(values$values, list(values$ind, windows), mean)
    
          1    2    3  ...
    X1 50.0 81.5 39.5
    X2 36.0 26.5 52.5
    X3 68.5 77.5 85.5
    X4 52.0 90.0 91.5