计算组内和时间内的百分比差异

Calulating percentage differences within groups and time

提问人:Sulz 提问时间:2/6/2023 最后编辑:MaëlSulz 更新时间:2/13/2023 访问量:57

问:

我确实有数据帧,如下所示:

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
R DataFrame 组合 多列

评论

0赞 user2974951 2/6/2023
您的输出会引发错误。

答:

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