将数据帧中的变量转换为R中的矩阵的最有效方法是什么?

时间:2018-03-21 10:09:42

标签: r dataframe data-manipulation

我需要在Windows上的R 3.4.1中的数据框上执行以下操作

  1. 按分类变量拆分数据框 - >获取由该分类变量分割的数据帧列表(不需要获取列表,这就是我的工作方式)。
  2. 从拆分的数据框列表中提取变量。
  3. 将分割后的变量合并到矩阵中。
  4. 转置矩阵。
  5. 目前我正在执行以下操作:

    t(sapply(split(df, df$date), function(x) x$avg_mean))
    

    我希望这项操作更有效率,即:

    1. 尽可能使用尽可能少的内存,即不是重复的对象。我可能需要使用1.5 GB的数据帧。
    2. 快速处理大型数据帧。
    3. 在R中执行此操作的最合适/最有效的方法是什么?并行化也很受欢迎,但并非严格必要,因为我不确定我是否能够使用它。

      如果您需要玩具数据框,请使用this

2 个答案:

答案 0 :(得分:1)

最好的方法可能是在split(df$avg_mean, df$date)的评论中建议的方向,并将结果绑定在一起。非常接近的第二个就是将您的向量转换为矩阵,直接利用每个日期的观察数量必须在您的情况下保持不变的事实。一些方法及其速度如下:

library(microbenchmark)
library(data.table)

dat <- data.frame(date = rep(c('A', 'B', 'C'), each = 1000), 
                  avg_mean = rnorm(3000))

f1 <- function(dat) {
  t(sapply(split(dat, dat$date), function(x) x$avg_mean))
}

f2 <- function(dat) {
  matrix(dat$avg_mean, nrow=length(unique(dat$date)), byrow = T)
}

f3 <- function(dat) {
  do.call(rbind, split(dat$avg_mean, dat$date))
}

f4 <- function(DF) {
  DF = data.table(DF)
  DF[ , index := 1:.N, by=date]
  DF_trx = dcast(DF, index~date, value.var = "avg_mean")
  DF_trx$index=NULL
  t(as.matrix(DF_trx))
}

microbenchmark(f1(dat), f2(dat), f3(dat), f4(dat))
#> Unit: microseconds
#>     expr      min       lq      mean    median        uq       max neval
#>  f1(dat)  456.064  475.542  617.0032  489.9390  515.6205  4250.471   100
#>  f2(dat)  107.062  110.907  150.3135  117.6060  124.1925  2992.862   100
#>  f3(dat)   74.313   79.927  122.2712   84.4455   89.4250  2504.850   100
#>  f4(dat) 3797.694 3893.886 4563.4614 4021.6505 5053.5800 15757.085   100

似乎do.call(rbind, split(dat$avg_mean, dat$date)可能是你最好的选择。

答案 1 :(得分:0)

我为每个组和数据表强制转换函数添加了一个索引来实现相同的功能。您应该使用数据表来提高效率

DF = data.table(DF)
DF[ , index := 1:.N, by=Col1]
DF_trx = dcast(DF, index~Col1, value.var = "Col2")
DF_trx$index=NULL
as.matrix(DF_trx)