按城市分组统计满足hour>=6的案例数及占比技术问询
解决按城市分组统计满足条件案例数及占比的问题
嘿,我来帮你搞定这个需求!你已经用aggregate()算出了hour的均值,那咱们把思路稍微扩展一下,就能轻松得到你要的满足hour>=6的案例数和对应占比啦。
先从你给的示例数据开始,咱们先把数据构造出来方便演示:
# 构造示例数据 df <- data.frame( city = c("A", "A", "A", "B", "C"), hour = c(7, 6, 3, 2, 7) )
方法1:用你熟悉的aggregate()函数
既然你已经在使用aggregate(),那咱们就从这个函数入手。核心思路是先标记每条记录是否满足条件,再分组统计:
- 先给数据添加一个标记列,把
hour>=6的记录标记为1,否则为0:
df$meet_condition <- as.integer(df$hour >= 6)
- 分别用
aggregate()统计每个城市满足条件的案例数,以及总案例数:
# 统计满足条件的数量 count_meet <- aggregate(meet_condition ~ city, data = df, sum) colnames(count_meet)[2] <- "count_meet" # 统计每个城市的总案例数 count_total <- aggregate(meet_condition ~ city, data = df, length) colnames(count_total)[2] <- "count_total"
- 把两个统计结果合并,再计算占比:
# 合并数据并计算占比 result <- merge(count_meet, count_total, by = "city") result$proportion <- result$count_meet / result$count_total
运行完上面的代码,result就是你要的结果啦:
city count_meet count_total proportion 1 A 2 3 0.6666667 2 B 0 1 0.0000000 3 C 1 1 1.0000000
(注:你示例里写B的满足数是1,但原数据里B的hour是2,所以实际满足数是0,占比0哦)
方法2:用dplyr更简洁高效(推荐)
如果愿意尝试更直观的语法,dplyr包的分组操作会让代码更简洁,可读性也更强:
首先确保你安装并加载了dplyr:
install.packages("dplyr") # 如果没安装过的话 library(dplyr)
然后一行流搞定所有统计:
result <- df %>% group_by(city) %>% summarise( count_meet = sum(hour >= 6), # 求和逻辑值,自动转为1/0计算数量 count_total = n(), # 获取分组内总条数 proportion = count_meet / count_total ) %>% ungroup()
这个方法的逻辑和第一种一致,但代码更紧凑,处理大规模数据时效率也更高,日常数据分析里用得很多~
内容的提问来源于stack exchange,提问作者Magal
相关产品推荐
相关产品推荐

