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

时间:2014-06-13 11:47:34

标签: 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      65      83
   45      53      25      63
   62      32      72      11
   24      75      12      66
   12      23      73      37
   45      23      56      74
   ...

我该怎么做:

  1. 对于Case中的每个values列,请逐行加入windows; 应该看起来像这样(Case1):

    W1 21
    W1 14
    W2 21
    W2 45
    W3 62
    W4 24
    W4 12
    W5 45

  2. 对于每个加入的window组,例如:

    • W1(案例1):21,14
    • W2(案例1):21,45
    • W3(案例1):62
    • W4(案例1):24,12
    • W5(案例1):45
    • W1(案例2):19,24

    计算平均值(或中位数);

  3. 完美的输出看起来像这样:

        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  
    

    注意:我尝试使用windowsvaluesrbindmerge加入data.frame,但数据集太大而且进程被杀死。

2 个答案:

答案 0 :(得分:0)

由于您有一个相当大的数据文件,我认为有两个很好的选择,使用data.tabledplyr。所以,您可以使用dplyr来完成此操作。

但首先,我认为你并不想merge valueswindows。根据您的描述,我认为您要做的是将windows添加为values的附加列(因为似乎没有任何内容可以合并)。

所以我首先要在values中创建其他列。 (我在这里假设,windows是一个向量,虽然从你的问题中不清楚,它也可能是一个data.frame,但你可以在这种情况下非常相似):

values$windows <- windows     #assuming windows is a vector

然后您可以使用dplyr进行计算:

方法1:

引用您要操作的每个列:

library(dplyr)

values %>%
  group_by(windows) %>%
  summarize(Case1 = mean(Case1, na.rm=TRUE),
            Case2 = mean(Case2, na.rm=TRUE),
            Case3 = mean(Case3, na.rm=TRUE),
            Case4 = mean(Case4, na.rm=TRUE))

方法2:

使用summarise_each对除分组变量(本例中为windows)之外的所有列执行相同的操作。如果您想要对大量列进行相同的操作,则可以节省一些输入。另外,如果需要,您可以指定更多要计算的函数,例如均值和中位数。

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的转换。如果您从&#34; big.matrix&#34;转换对于矩阵工作,我认为,这应该与原始数据的工作原理相同。

# 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)))

答案 1 :(得分:0)

这绝不是最优雅的解决方案,但它似乎可以通过将values数据堆叠到单个列然后使用tapply()函数来执行您想要的操作。它还可以防止将windows因素和values数据绑定在一起。

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

> 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

现在将values数据堆叠到一个列中,创建一个新变量ind

> values <- stack(values)

并重复您的窗口值以匹配堆叠数据帧的长度:

> windows <- rep(windows, 4)

现在,您可以使用简单的tapply为每列计算windows变量的平均值:

> 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 
相关问题