1

我在 R 中有一个 tibble 对象,如下所示: 在此处输入图像描述

对于每一列,我想从 row2 中减去 row1。我目前的方法如下:

mean.diff <- each.group.mean[1,2:num.groups]-each.group.mean[2,2:num.centroids]

令人困惑的是,要在 2x9660 tibble 上执行此语句,代码需要 8-15 秒,由 Sys.time() 计算确定。将不胜感激任何帮助,使这更快,并理解为什么这个命令需要这么长时间。

4

1 回答 1

2

通过unlisting,我们可以将其转换为 avector并使其更高效

unlist(each.group.mean[1,2:num.groups], use.names = FALSE)-
    unlist(each.group.mean[2,2:num.centroids], use.names = FALSE)

原因是 a data.frameor tibbleetc 具有许多类属性,这使得执行子集和计算的速度变慢。通过转换为vector所有这些类被剥离。使用可重现的示例

数据

set.seed(24)
df1 <- as.tibble(as.data.frame(matrix(sample(1:10, 9660*10, 
     replace = TRUE), ncol = 9660)))

基准

system.time(df1[1,] - df1[2,])
#   user  system elapsed 
#   0.78    0.00    0.78 

system.time(unlist(df1[1,], use.names = FALSE) - unlist(df1[2,], use.names = FALSE))
#   user  system elapsed 
#   0.03    0.00    0.03 
于 2017-09-20T04:33:28.163 回答