我需要对数据进行简单的整形,从长到宽,这需要在R中工作。对于这个用例,reshape()似乎非常慢(尽管Assert它非常快https://stackoverflow.com/a/12073077/3017280)。这个例子是我的数据的合理近似。我知道在这个例子中我不需要两个Index列,但是我在真实的数据中需要。在我的笔记本电脑上,10,000行需要3秒,40,000行需要200多秒。真实的数据有超过一百万行,所以repeat()显然是不可行的。有人能解释一下为什么在这种情况下需要这么长时间吗?我使用split / lapply / Reduce + merge解决了这个问题,这是笨拙的,但非常快。
n <- 5000
dfLong <- data.frame(Index1 = rep(sample(1E6:2E6, n), 4),
Index2 = rep(sample(3E6:4E6, n), 4),
Key = rep(1:4, each = n),
Date = sample(seq.Date(as.Date("2020-01-01"),
as.Date("2021-12-31"),
by = "1 day"),
size = n * 4, replace = TRUE),
Score = sample(0:48, n * 4, replace = TRUE))
system.time(dfWide <- reshape(data = dfLong,
v.names = c("Date", "Score"),
timevar = "Key",
idvar = c("Index1", "Index2"),
sep = "_Q",
direction = "wide"))
3条答案
按热度按时间n3h0vuf21#
如果您查看
reshape
使用profvis包调用的函数,您可以看到几乎所有的总时间都花在函数的这一行上。interaction
函数仅用于将两个id列合并合并为一列。而不是
interaction
,您可以使用do.call(paste0, data[, idvar]
)。您可以使用一个函数来创建一个interaction
等于这个更快的函数的环境。现在快多了
您可以使用
plyr:::ninteraction
来实现更快的速度。这个函数唯一的非基础依赖是plyr:::id_var
,它没有依赖,这意味着如果你不能安装软件包,你可以很容易地复制粘贴这个函数定义(添加一个注解)。8zzbczxx2#
我不知道我曾经声称
stats::reshape
是最快的。相比之下,
stats::reshape
在我的i9/64 GB-ram系统上没有那么快:但其他重塑功能做得更好:
同样,
data.table::dcast
也同样快:nkhmeac63#
考虑一个高级修改版本的@Moody_Mudskipper的matrix_spread,使用基R。由于
matrix
将简化像Date
这样的复杂类型,因此需要进行一些临时更改:功能
申请
注意:如果跨多列运行,请确保通过
matrix_spread
运行前 * 按key和所有id变量对数据进行排序。