问题
我试图按组对数据框中的每一列求和,如果总和不为 0,则将值设置为 1。我尝试使用 max 函数而不是组合(sum 和 ifelse),但我一直在获取 Inf值。但是,组合需要太多时间来计算,我有 150 万行和 500 个虚拟变量要汇总。
有没有更好的方法来实现这一目标?
示例数据集
library(tidyverse)
library(tibble)
library(data.table)
rename <- dplyr::rename
select <- dplyr::select
set.seed(10002)
id <- sample(1:20, 1000, replace=T)
set.seed(10003)
group1 <- sample(0:1, 1000, replace=T)
set.seed(10004)
group2 <- sample(0:1, 1000, replace=T)
dummies <-
data.frame(id, group1, group2)
当前方法
# I am trying to sum each column in a data frame by group and
# set the value as 1 if the sum is not 0.
dummies %>%
ddply('id', function(x){
x %>%
select_if(is.numeric) %>%
summarise_each(list(sum)) %>%
mutate_if(is.numeric, ~ifelse(.x > 0,1,.x))
}, .progress = 'text') # It takes too much time
最佳答案
我们可以通过切换到 dplyr
来减少时间。此外,不是执行 sum
然后使用 ifelse
来检查和重新转换,这可以通过检查大于 0< 的 any
值直接完成/p>
library(dplyr)
dummies %>%
dplyr::select(id, where(is.numeric)) %>%
dplyr::group_by(id) %>%
dplyr::summarise(across(everything(), ~ +(any(. > 0, na.rm = TRUE))))
或使用data.table
library(data.table)
setDT(dummies)[, lapply(.SD, function(x)
+(any(x > 0, na.rm = TRUE))), id, .SDcols = patterns('group')]
关于r - 使用 ddply R 对大数据框中的大量列进行求和和 ifelse 的更好更快的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68462396/