提问人:Sulz 提问时间:2/6/2023 最后编辑:MaëlSulz 更新时间:2/13/2023 访问量:57
计算组内和时间内的百分比差异
Calulating percentage differences within groups and time
问:
我确实有数据帧,如下所示:
A <- data.frame(GroupName = c(rep(c("A", "B", "C"), each = 6)),
ObservationName = c("alpha", "beta", "gamma", "alpha", "beta", "gamma", rep(c("delta", "epsilon"),3), rep(c("zeta", "eta", "theta"),2)),
Date = rep(rep(seq(as.Date("2010-1-1"), as.Date("2010-3-1"), by = "month"), each =3), 2),
Value = runif(n = 18, min = 1, max = 10))
现在,我想计算始终在组 (Groupname) 和同一月份 (Date) 内的值的百分比变化,如果测量值在同一月份(和组)中,则计算该组内所有观测值之间的百分比变化。我的输出结果应该看起来像这样(只有 A 组的前四个案例,其余的应该像这样进行):
B <- data.frame(GroupName = c("A", "A", "A", "A"),
ObservationName1 = c("alpha", "alpha", "beta", "alpha"),
ObservationName2 = c("beta", "gamma", "gamma", "beta"),
Date = c(as.Date("2010-1-1"), as.Date("2010-1-1"), as.Date("2010-1-1"), as.Date("2010-2-1")),
Diff = c(abs(A[1,4]-A[2,4])/ ((A[1,4]+A[2,4])/2), #alpha beta Jan
abs(A[1,4]-A[3,4])/ ((A[1,4]+A[3,4])/2), #alpha gamma Jan
abs(A[2,4]-A[4,4])/ ((A[2,4]+A[4,4])/2), #beta gamma Jan
abs(A[4,4]-A[5,4])/ ((A[4,4]+A[5,4])/2))) #alpha gamma Feb
答:
3赞
Maël
2/6/2023
#1
跟:combn
library(dplyr) #1.1.0
A %>%
reframe(result = combn(seq_along(Value), 2, function(i)
list(ObservationName1 = ObservationName[i][1],
ObservationName2 = ObservationName[i][2],
Diff = abs(diff(Value[i])) / (sum(Value[i]) / 2)), # The pairs
simplify = FALSE),
.by = c(GroupName, Date)) %>%
unnest_wider(result)
输出
# A tibble: 18 × 5
GroupName Date ObservationName1 ObservationName2 Diff
<chr> <date> <chr> <chr> <dbl>
1 A 2010-01-01 alpha beta 0.414
2 A 2010-01-01 alpha gamma 0.250
3 A 2010-01-01 beta gamma 0.168
4 A 2010-02-01 alpha beta 0.675
5 A 2010-02-01 alpha gamma 0.480
6 A 2010-02-01 beta gamma 1.07
7 B 2010-03-01 delta epsilon 1.55
8 B 2010-03-01 delta delta 1.11
9 B 2010-03-01 epsilon delta 0.779
10 B 2010-01-01 epsilon delta 0.841
11 B 2010-01-01 epsilon epsilon 0.559
12 B 2010-01-01 delta epsilon 0.321
13 C 2010-02-01 zeta eta 0.770
14 C 2010-02-01 zeta theta 0.000664
15 C 2010-02-01 eta theta 0.770
16 C 2010-03-01 zeta eta 0.799
17 C 2010-03-01 zeta theta 0.350
18 C 2010-03-01 eta theta 0.483
以前:dplyr 1.1.0
A %>%
group_by(GroupName, Date) %>%
summarise(result = combn(seq_along(Value), 2, function(i)
list(ObservationName1 = ObservationName[i][1],
ObservationName2 = ObservationName[i][2],
Diff = abs(diff(Value[i])) / (sum(Value[i]) / 2)), # The pairs
simplify = FALSE)) %>%
ungroup() %>%
unnest_wider(result)
评论
0赞
Sulz
2/6/2023
说找不到函数重新格式化,(即使以下 tidyverse.org/blog/2022/11/dplyr-1-1-0-is-coming-soon):我的会话信息给出: 其他附加包: [1] tidyr_1.2.1 dplyr_1.1.0.9000 如果我取消连接 tidyr 它找不到函数 unnes_wider()
0赞
Maël
2/6/2023
您需要安装 .dplyr 1.1.0
0赞
Maël
2/6/2023
@Sulz请参阅 dplyr 版本 1.1.0 的编辑<
0赞
Sulz
2/7/2023
非常感谢!我真的很喜欢这个解决方案。是否可以添加一个条件,即当某个月在一个组名中只有一个观察名时,它应该跳过/删除这些情况(我为我的原始数据找到了),它显然无法计算。
0赞
Maël
2/7/2023
之后,您仍然可以使用该观察任务来删除不需要的观察结果filter
上一个:R 合并关闭值
评论