gpt4 book ai didi

r - 使用 ddply R 对大数据框中的大量列进行求和和 ifelse 的更好更快的方法

转载 作者:行者123 更新时间:2023-12-04 13:08:03 24 4
gpt4 key购买 nike

问题

我试图按组对数据框中的每一列求和,如果总和不为 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com