【问题标题】:How to do sum and filter in rbind function如何在 rbind 函数中进行求和和过滤
【发布时间】:2021-01-14 19:38:21
【问题描述】:

我正在使用一个 R 包,它根据每个表的标志从数据库中的表中提取数据。如果标志是1,则从该表中提取数据。如果标志是0,则不要提取数据。

提取的数据存储在person_list_df列表中,如下所示

list(structure(list(person_id = 21:25, count = 2:6), class = "data.frame", row.names = c(NA, 
    -5L)), structure(list(person_id = 24:28, count = 3:7), class = "data.frame", row.names = c(NA, 
    -5L)))  

代码如下

 person_list_df = list()
 casesANDcontrols_df = list()
 list1 <- data.frame("person_id" = 21:25, "count" = 2:6)
 list2 <- data.frame("person_id" = 24:28, "count" = 3:7)
 person_list_df <- list(list1, list2)
 

我想做的是

a) 合并/合并所有这些并获得计数总和(针对每个人)

b) 只过滤和存储 count > 4 的人

我尝试了以下方法,但它不起作用

casesANDcontrols_df[[1]] <- do.call(rbind, persons_list_df) # how to sum and apply filter here?

我想合并/合并所有这些并总结他们的计数,最后选择计数> 4的人

我希望我的输出如下所示

casesANDcontrols_df[[1]]

        person_id
    1   24        #COUNT IS 8
    2   25        #COUNT IS 10
    3   26        #COUNT IS 5
    4   27        #COUNT IS 6
    5   28        #COUNT IS 7  

caseANDcontrols_df的结构应该如下图所示

【问题讨论】:

    标签: r dataframe data.table lapply rbind


    【解决方案1】:

    您可以使用data.table 中的rbindlist 函数,它会输出data.table,因此您可以链接:

    bindeddf <- rbindlist(persons_list_df)[,.(count = sum(count)),by = person_id]
    bindeddf[count>4]
    

    【讨论】:

      【解决方案2】:

      使用tidyverse

      library(dplyr)
      bind_rows(persons_list_df) %>%
           group_by(person_id) %>%
           summarise(count = sum(count)) %>%
           filter(count > 4)
      

      【讨论】:

      • @TheGreat Sure,让我检查一下
      • 我在尝试建议的解决方案时遇到如下所示的错误,Error: Problem with summarise() input count. x invalid 'type' (closure) of argument i Input count` 是 sum(count)。 i 错误发生在第 1 组:person_id = 53558。运行rlang::last_error() 以查看错误发生的位置。`
      【解决方案3】:

      在基础 R 中,您可以将列表与do.call +rbind 组合成一个数据框,为每个person_idsum 并保留count 大于4 的行。

      subset(aggregate(count~person_id, do.call(rbind,persons_list_df), sum),count > 4)
      

      【讨论】:

      • 当我尝试执行建议的代码时,出现如下错误Error in model.frame.default(formula = count ~ person_id, data = do.call(rbind, : object is not a matrix
      • @TheGreat 您能否使用dput 提供您的数据,这将有助于调试问题。
      • 您好 Ronak,我想在示例数据中创建如上所示的列表列表(包含两列)。但是我无法创建。我现在正在尝试创建。请几分钟。我需要你的帮助
      • 您好 Ronak,我提供了带有 dput 语句的示例数据。可以帮助我,拜托。在输出中,我只想看到一列 person_id。我希望将person_id 分配给casesANDcontrols_df[[1]]
      • casesANDcontrols_df 也是一个最初定义的空列表
      猜你喜欢
      • 2018-04-20
      • 2021-09-10
      • 2018-12-04
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      相关资源
      最近更新 更多