请求编写R函数计算站点箱型占比并生成数据调整列
解决站点箱型数量不均的列调整问题
现有4个站点A、B、C、D,共8种箱型,各站点箱型数量不等,箱型在多日期被检查(同站点检查日期一致,不同站点不同)。需要在数据集中新增调整列,解决各站点箱型数量不均的问题。
数据结构
# A tibble: 16 × 5 Site ID Date Type Count <fct> <fct> <date> <fct> <dbl> 1 A 101 2024-02-02 x 4 2 A 101 2024-02-02 y 6 3 A 101 2024-02-02 x 9 4 B 103 2024-02-01 x 10 5 B 103 2024-02-01 z 2 6 C 106 2024-01-30 y 8 7 D 108 2024-01-26 x 5 8 D 108 2024-01-26 z 6 9 A 101 2024-01-24 x 3 10 A 101 2024-01-24 y 3 11 A 101 2024-01-24 x 4 12 B 103 2024-01-21 x 8 13 B 103 2024-01-21 z 5 14 C 106 2024-01-20 y 5 15 D 108 2024-01-19 x 7 16 D 108 2024-01-19 z 7 structure(list(Site = structure(c(1L, 1L, 1L, 2L, 2L, 3L, 4L, 4L, 1L, 1L, 1L, 2L, 2L, 3L, 4L, 4L), levels = c("A", "B", "C", "D"), class = "factor"), ID = structure(c(1L, 1L, 1L, 2L, 2L, 3L, 4L, 4L, 1L, 1L, 1L, 2L, 2L, 3L, 4L, 4L), levels = c("101", "103", "106", "108"), class = "factor"), Date = structure(c(19755, 19755, 19755, 19754, 19754, 19752, 19748, 19748, 19746, 19746, 19746, 19743, 19743, 19742, 19741, 19741), class = "Date"), Type = structure(c(1L, 2L, 1L, 1L, 3L, 2L, 1L, 3L, 1L, 2L, 1L, 1L, 3L, 2L, 1L, 3L), levels = c("x", "y", "z"), class = "factor"), Count = c(4, 6, 9, 10, 2, 8, 5, 6, 3, 3, 4, 8, 5, 5, 7, 7)), row.names = c(NA, -16L), class = c("tbl_df", "tbl", "data.frame"))
字段说明:
Site:站点ID:站点内位置(每个唯一ID对应3个箱子)Date:检查日期Type:箱型Count:单箱当日计数
原错误代码
mutated table <- df %>% group_by(Site, Type, ID) %>% mutate(n_unique = n_distinct(ID)*3) %>% mutate(n_boxes = n_distinct(Site)*3) %>% mutate(Adjustment = n_boxes / n_unique)
明确需求
- 新增
n_unique列:对应站点的总箱数,即站点内唯一ID的数量×3,同站点所有行值相同; - 新增
n_boxes列:对应站点对应箱型的数量,即该站点该箱型的观测数; - 新增
adj_modifier列:计算n_boxes/n_unique,用于乘以Count得到调整后计数。
修正后的解决方案
library(dplyr) adjusted_df <- df %>% # 按站点分组,计算站点总箱数n_unique group_by(Site) %>% mutate(n_unique = n_distinct(ID) * 3) %>% # 在站点分组基础上添加箱型分组,计算该站点该箱型的观测数n_boxes group_by(Site, Type, .add = TRUE) %>% mutate(n_boxes = n()) %>% # 计算调整系数 mutate(adj_modifier = n_boxes / n_unique) %>% # 取消分组,避免后续操作受分组限制 ungroup()
代码说明
group_by(Site):确保n_unique的计算基于整个站点的唯一ID数量,每个站点的所有行都会得到相同的总箱数;group_by(Site, Type, .add = TRUE):保留原站点分组的同时,新增箱型分组,此时n()会返回当前站点当前箱型的总行数(即观测数);- 最后计算
adj_modifier并取消分组,保证后续数据操作的灵活性。
例如,站点A的唯一ID仅为101,所以n_unique = 1*3 = 3;站点A中Type=x的观测数为4行,因此n_boxes=4,adj_modifier=4/3,符合需求。
内容的提问来源于stack exchange,提问作者Bethy
相关产品推荐
相关产品推荐

