You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 20:51:02