我有这个data.frame
等长组(id
)
id | amount
--------------
A | 10
A | 54
A | 23
B | 34
B | 76
B | 12
我想按组 id
转置:
id |
----------------------
A | 10 | 54 | 23
B | 34 | 76 | 12
这样做最有效的方法是什么?
我以前用过reshape
,dcast
但它们确实很慢!(我有很多数据,很想加快这个瓶颈)
有更好的策略吗?使用data.table
还是矩阵??任何帮助将非常感激!
# Little data.frame
df <- data.frame(id=c(2,2,2,5,5,5), amount=as.integer(c(10,54,23,34,76,12)))
# Not so little data.frame
set.seed(10)
df <- data.frame(id = rep(sample(1:10000, 10000, replace=F),100), amount=as.integer(floor(runif(1000000, -100000,100000))))
# Create time variable
df$time <- ave(as.numeric(df$id), df$id, FUN = seq_along)
# The base R reshape strategy
system.time(df.reshape <-reshape(df, direction = "wide", idvar="id", timevar="time"))
user system elapsed
6.36 0.31 6.69
# The reshape2 dcast strategy
require(reshape2)
a <- system.time(mm <- melt(df,id.vars=c('id','time'),measure.vars=c('amount')))
b <- system.time(df.dcast <- dcast(mm,id~variable+time,fun.aggregate=mean))
a+b
user system elapsed
14.44 0.00 14.45
更新
使用每个组长度相等的事实,您可以使用matrix
-function。
df.matrix <- data.frame(id=unique(df$id), matrix(df$amount, nrow=(length(unique(df$id))), byrow=T))
user system elapsed
0.03 0.00 0.03
注意:此方法假定 data.frame 预先排序为id
。