如何在R中按misc分组计算小于指定值的数据行占比?
实现方法
对于你的需求,用dplyr和tidyr两个工具包就能简单实现,步骤如下:
1. 准备工作(安装并加载包)
如果还没安装这两个包,先运行:
install.packages(c("dplyr", "tidyr"))
然后加载包:
library(dplyr) library(tidyr)
2. 构造原始数据框
把你给出的数据转换成R的dataframe:
df <- data.frame( misc = c("a", "a", "a", "b", "b", "b", "c", "c", "c"), data = c(0.0, 0.1, 0.2, 0.0, 0.2, 0.3, 0.0, 0.4, 0.6) )
3. 生成目标data序列
按照你的要求生成指定范围的序列:
target_data <- seq(0.0, 10.0, by = 0.01)
4. 计算每个misc分组的比例
通过分组、扩展笛卡尔积、计算符合条件的行数占比来实现:
result_df <- df %>% # 按misc分组 group_by(misc) %>% # 给每个分组匹配所有目标data值 expand(data = target_data) %>% # 计算比例:当前分组中原始data小于当前目标data的行数 / 分组总行数 mutate(proportion = sum(df$data[df$misc == misc] < data) / length(df$data[df$misc == misc])) %>% # 取消分组 ungroup()
验证结果
你可以查看指定分组的前几行,和你给出的示例匹配:
head(result_df[result_df$misc == "a", ]) head(result_df[result_df$misc == "c", ])
关键代码说明
expand(data = target_data):给每个misc分组添加所有目标data值,形成笛卡尔积,确保每个misc对应所有目标data。sum(df$data[df$misc == misc] < data):统计当前分组中原始data小于当前目标data的行数。length(df$data[df$misc == misc]):获取当前分组的总行数(比如a组固定有3行)。
内容的提问来源于stack exchange,提问作者clino
相关产品推荐
相关产品推荐

