转置data.table

6

在数据计算结束后,高效转换 data.table 的好方法是什么?

nrow=500e3
ncol=2000
m <- matrix(rnorm(nrow*ncol),nrow=nrow)
colnames(m) <- c('foo',seq(ncol-1))
dt <- data.table(m)
df <- as.data.frame(m)
dt <- t(dt)  #take a long time and converts the data table to a matrix

计算时间

1. to transpose the matrix
system.time(mt <- t(m))
   user  system elapsed
 20.005   0.016  20.024

2. to transpose the dt
system.time(dt <- t(dt))
user  system elapsed
32.722  15.129  47.855

3. to transpose a df
system.time(df <- t(df))
user  system elapsed
32.414  15.357  47.775

dt[,10]应该可以回答你的第二个问题。 - Señor O
2
我刚意识到 dt[,'10',with=F] 是可行的...实际上我已经移除了第二个问题。 - Abhi
1
data.frame中进行转置需要多长时间?您的系统有多少内存?仅矩阵本身就需要占用7.4GB的空间。 - Arun
1
@SeñorO,我想这并不令人感到意外。在第一种情况下,元素都按相同的顺序排列(按列)。但在第二种情况下,每一行都必须作为一列放置(并且表示方式是按列,它们不会在连续的内存位置中,无法使用memcpy)...而你必须重复这个过程5e5次!至少我认为是这样的。 - Arun
1
好的,我再问一遍。从data.frame转置需要多长时间?你的系统有多少内存,因为仅矩阵就需要7.4GB的空间? - Arun
显示剩余10条评论
1个回答

0

这是一个相当古老的问题,自从那时以来,data.table已经添加/导出了用于转置列表的transpose。就性能而言,除了矩阵外,它都比t表现更好(我认为这是可以预料的)。

system.time(t(m))
 #   user  system elapsed 
 # 23.990  23.416  85.722 
system.time(t(dt))
 #   user  system elapsed 
 # 31.223  53.197 195.221 
system.time(t(df))
 #   user  system elapsed 
 # 30.609  45.404 148.323 
system.time(setDT(transpose(dt)))
 #   user  system elapsed 
 # 42.135  38.478 116.599

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接