R 函数可计算每个站点的盒子类型比例

问题描述 投票:0回答:1

我正在寻求一些帮助来生成数据集的新列,该列将充当“调整”数字,以克服每个站点上每种框类型数量不等的限制。 我有四个站点 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"))

还有比这更多的条目,但你已经明白了要点。站点列与组相关,ID 列是站点上的位置。我这里的示例并不能很好地展示这一点,因为没有足够的行,但每个唯一 ID 都有 3 个与该位置关联的框(尽管它们可能是相同或不同的类型)。日期是检查日期。框的类型是我想要检查的内容,计数是该日期单个框内的结果计数。

这是我最初写的,但它不起作用:

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)

提前感谢您可以帮助我的任何更正或替代解决方案。

r group-by mutate
1个回答
0
投票

不确定这是否是您要找的:

library(dplyr)
df %>%
  group_by(Site, ID, Type) %>%
  mutate(sumCount_siteidtype = sum(Count)) %>%
  group_by(Site, ID) %>%
  mutate(sumCount_siteid = sum(Count)) %>%
  ungroup()
# # A tibble: 16 × 7
#    Site  ID    Date       Type  Count sumCount_siteidtype sumCount_siteid
#    <fct> <fct> <date>     <fct> <dbl>               <dbl>           <dbl>
#  1 A     101   2024-02-02 x         4                  20              29
#  2 A     101   2024-02-02 y         6                   9              29
#  3 A     101   2024-02-02 x         9                  20              29
#  4 B     103   2024-02-01 x        10                  18              25
#  5 B     103   2024-02-01 z         2                   7              25
#  6 C     106   2024-01-30 y         8                  13              13
#  7 D     108   2024-01-26 x         5                  12              25
#  8 D     108   2024-01-26 z         6                  13              25
#  9 A     101   2024-01-24 x         3                  20              29
# 10 A     101   2024-01-24 y         3                   9              29
# 11 A     101   2024-01-24 x         4                  20              29
# 12 B     103   2024-01-21 x         8                  18              25
# 13 B     103   2024-01-21 z         5                   7              25
# 14 C     106   2024-01-20 y         5                  13              13
# 15 D     108   2024-01-19 x         7                  12              25
# 16 D     108   2024-01-19 z         7                  13              25

如果您使用的是

dplyr_1.1.0
或更新版本 (
packageVersion("dplyr")
),您可以使用以下命令将其缩短一点:

df %>%
  mutate(sumCount_siteidtype = sum(Count), .by = c(Site, ID, Type)) %>%
  mutate(sumCount_siteid = sum(Count), .by = c(Site, ID))
© www.soinside.com 2019 - 2024. All rights reserved.