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

How to do sum and filter in rbind function

我正在使用一个 R 包,它根据每个 table 的标志从数据库中的 table 中提取数据。如果标志是 1,则从 table 中提取数据。如果标志是 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) Combine/Merge 所有这些并得到计数总和(对于每个人)

b) 仅过滤并存储计数 > 4

的人

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

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

我想 combine/merge 所有人并对他们的计数求和,最后 select 计数 > 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的结构应该如下图

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

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

在 base R 中,您可以使用 do.call +rbind 将列表组合成一个数据帧,每个 person_idsum 并保留行 [=15] =] 大于 4.

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

使用tidyverse

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