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

标签 r dplyr plyr

问题

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

相关文章:

r - 将值和上标添加到饼图标签

r - 使用 plyr : melt/cast vs. ddply 修复基于 reshape 的习惯

带有 data.table 的滚动加权平均值

python - 在 pandas 列上操作时避免重复数据框名称

r - 使用 dplyr 从数据框中删除遵循过滤器阈值的所有行

r - dplyr:在连续变异内求和

r - 在 Shiny 中使用 varSelectInput 过滤数据?

删除所有最小值和最大值,然后在 R 中求平均值

r - 从主题列表中阻止 Bootstrap

r - 在 R 中转换单个单元格中的列