使用dplyr处理频率表:生成频率分布列并转换value列
用dplyr处理长格式频率表的比例计算
你需要针对不同Status分组计算value的占比,具体逻辑是每个Status组内的value除以该组的总value,得到频率分布列prop。以下是实现代码:
首先加载dplyr包:
library(dplyr)
接着处理你的数据:
# 还原示例数据 test_data <- structure(list(ref = c(5L, 5L, 5L, 10L, 10L, 10L, 15L, 15L, 15L), Status = c("status1", "status2", "status3", "status1", "status2", "status3", "status1", "status2", "status3"), value = c(1718L, 0L, 0L, 576L, 24L, 0L, 224L, 104L, 3L)), row.names = c(NA, -9L), class = c("tbl_df", "tbl", "data.frame")) # 计算比例并调整列名 result <- test_data %>% group_by(Status) %>% mutate(prop = value / sum(value)) %>% ungroup() %>% rename(conc = ref, Sensor_Status = Status) # 查看最终结果 print(result)
代码说明:
group_by(Status):按Status字段分组,确保后续计算仅在同状态组内进行mutate(prop = value / sum(value)):新增prop列,每个value除以所在状态组的总value,得到该值在组内的占比ungroup():取消分组,避免后续数据操作受到分组约束rename():将列名调整为你期望输出中的conc和Sensor_Status,不需要修改列名可省略此步骤
运行后得到的结果和你提供的期望输出完全一致:
# A tibble: 9 × 4 conc Sensor_Status value prop <int> <chr> <int> <dbl> 1 5 status1 1718 0.682 2 5 status2 0 0 3 5 status3 0 0 4 10 status1 576 0.229 5 10 status2 24 0.188 6 10 status3 0 0 7 15 status1 224 0.0890 8 15 status2 104 0.812 9 15 status3 3 1
内容的提问来源于stack exchange,提问作者trailblazer_1
相关产品推荐
相关产品推荐

