问题描述
我正在使用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
的结构应如下所示
解决方法
您可以使用rbindlist
中的data.table
函数,它输出一个data.table
,因此您可以链接:
bindeddf <- rbindlist(persons_list_df)[,.(count = sum(count)),by = person_id]
bindeddf[count>4]
,
在基数R中,您可以将列表与do.call
+ rbind
组合成一个数据帧,对每个sum
取person_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)