使用dplyr统计仅含day、仅含night、同时包含两者的ID数量
解决方法
核心逻辑是先按ID分组,判断每个ID的时段覆盖类型,再分类统计数量,完整可运行代码如下:
library(dplyr) # 构造示例数据集 df <- structure(list(id = c(1, 1, 2, 3, 4, 4), time = c("day", "night", "night", "day", "day", "night")), class = "data.frame", row.names = c(NA, -6L)) # 统计各类ID数量 df %>% group_by(id) %>% summarise( has_day = any(time == "day"), has_night = any(time == "night") ) %>% mutate( id_type = case_when( has_day & has_night ~ "同时包含day和night", has_day ~ "仅包含day", has_night ~ "仅包含night" ) ) %>% count(id_type, name = "ID数量")
运行结果
# A tibble: 3 × 2 id_type `ID数量` <chr> <int> 1 仅包含day 1 2 仅包含night 1 3 同时包含day和night 2
代码说明
group_by(id):将数据集按ID分组,后续操作都针对同一个ID的所有记录执行any(time == "xxx"):判断当前ID下是否存在至少一条对应时段的记录,返回逻辑值case_when():根据两个逻辑值的组合,给每个ID打上对应的分类标签count():统计每类ID的总数,参数name可自定义统计结果的列名
原代码问题说明
你之前的写法先过滤时段再计数,统计的是符合条件的记录条数,没有按ID去重,也没有判断单个ID下所有记录的时段覆盖情况,因此无法得到对应ID的数量。
内容的提问来源于stack exchange,提问作者z_11122
相关产品推荐
相关产品推荐

