我需要在Windows上的R 3.4.1中的数据框上执行以下操作
目前我正在执行以下操作:
t(sapply(split(df, df$date), function(x) x$avg_mean))
我希望这项操作更有效率,即:
在R中执行此操作的最合适/最有效的方法是什么?并行化也很受欢迎,但并非严格必要,因为我不确定我是否能够使用它。
如果您需要玩具数据框,请使用this。
答案 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)