我在R中有一个数据框,如下所示:
Group.ID status
1 1 open
2 1 open
3 2 open
4 2 closed
5 2 closed
6 3 open
我想计算条件下的ID数:当所有状态为“打开”时,相同的ID号。例如,组ID 1有两个观察值,它们的状态都是“打开”的,所以这是我的计数。组ID 2不是因为并非组ID 2都打开了所有状态。
我可以在条件下统计行或组ID。但是我不知道如何应用“所有状态等于一个组的值”逻辑。
DATA。
df1 <-
structure(list(Group.ID = c(1, 1, 2, 2, 2, 3), status = structure(c(2L,
2L, 2L, 1L, 1L, 2L), .Label = c("closed", "open"), class = "factor")), .Names = c("Group.ID",
"status"), row.names = c(NA, -6L), class = "data.frame")
答案 0 :(得分:1)
以下是两个解决方案,两个都使用base R
,另一个使用aggregate
,另一个使用tapply
。如果您只想要与您请求匹配的Group.ID
总数,我建议您使用第二种解决方案。
agg <- aggregate(status ~ Group.ID, df1, function(x) as.integer(all(x == "open")))
sum(agg$status)
#[1] 2
sum(tapply(df1$status, df1$Group.ID, FUN = function(x) all(x == "open")))
#[1] 2
答案 1 :(得分:0)
dplyr
解决方案:
library(dplyr)
df1 %>%
group_by(Group.ID) %>%
filter(cumsum(status == "open") == 2) %>%
nrow()