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

请求编写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()

代码说明

  1. group_by(Site):确保n_unique的计算基于整个站点的唯一ID数量,每个站点的所有行都会得到相同的总箱数;
  2. group_by(Site, Type, .add = TRUE):保留原站点分组的同时,新增箱型分组,此时n()会返回当前站点当前箱型的总行数(即观测数);
  3. 最后计算adj_modifier并取消分组,保证后续数据操作的灵活性。

例如,站点A的唯一ID仅为101,所以n_unique = 1*3 = 3;站点A中Type=x的观测数为4行,因此n_boxes=4,adj_modifier=4/3,符合需求。

内容的提问来源于stack exchange,提问作者Bethy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 03:59:52