有没有比 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 小时的时间太多了,无法执行此计算。
我有一个 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 小时的时间太多了,无法执行此计算。