有没有比 dplyr 更有效的方法来获得大量列的方差?

Is there a more efficient way to obtain variance of lot's of columns than dplyr?

我有一个 data.frame 超过 250,000 列和 200 行,因此大约有 5000 万个独立值。我正在尝试对列的方差进行细分,以便 select 方差最大的列。

我正在使用 dplyr 如下:

df %>% summarise_if(is.numeric, var)

它已经 运行 在我的 16gb RAM 的 imac 上运行了大约 8 个小时。

有没有办法为调用分配更多资源,或者有更有效的方法来汇总列间的差异?

非常宽 data.frames 效率很低。我认为转换为矩阵并使用 matrixStats::colVars() 是最快的。

我打赌先选择列,然后计算方差,会快很多:

df <- as.data.frame(matrix(runif(5e7), nrow = 200, ncol = 250000))

df_subset <- df[,sapply(df, is.numeric)]
sapply(df_subset, var)

上面的代码在我的机器上运行大约一秒钟,这是计算每一列的方差,因为在我的示例中它们都是数字。

您可以尝试使用通常更快的 data.table

library(data.table)

cols <- names(Filter(is.numeric, df))
setDT(df)
df[, lapply(.SD, var), .SDcols = cols]

您可以尝试的另一种方法是以长格式获取数据。

library(dplyr)
library(tidyr)

df %>%
  select(where(is.numeric)) %>%
  pivot_longer(cols = everything()) %>%
  group_by(name) %>%
  summarise(var_value = var(value))

但我同意@Daniel V 的观点,值得检查数据,因为 8 小时的时间太多了,无法执行此计算。