如何在rbind函数中求和和过滤

问题描述

我正在使用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),-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)过滤并仅存储计数> 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的结构应如下所示

enter image description here

解决方法

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

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

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

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

使用tidyverse

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