基于偏斜周数的中心数据

Centre data based on skewed week numbers

我有一个问题,我可以在 excel 中手动在 2 分钟内完成,但我需要将它合并到 R 中的一个函数中。

原始数据集:

df <- data.frame(week=c(1:52), values=c(77, 87, 74, 72, 62, 79, 85, 114,    170,    178,
                                    141,    143,    118,    124,    112,    92, 76, 64, 62, 
                                    75, 63, 60, 76, 69, 60, 46, 42, 34, 23, 21, 19, 
                                    23, 23, 26, 24, 18, 21, 21, 25, 38, 21, 17, 20, 16, 
                                    9,  6,  6,  17, 36, 52, 65, 79))   

看起来像这样:

    week values
1    1     77
2    2     87
3    3     74
4    4     72
5    5     62
6    6     79

问题:我有一个基于一年中几周的值向量(我为示例数据集创建了一个较小的数据集)。我需要能够为最高值分配 0 值,然后根据距离峰值的周数为该值的任一侧分配一个数字。峰值两侧的值可能会波动,所以我不能只使用排名并使用它分配数字,它必须按周排名。

我遇到的主要问题是我的周数是根据我们的日历年计算的,但峰值出​​现在第 10 周,所以第 10 周以上的值从 1 到 42,并且 -第 10 周以下 1 到 -9。

df_final <- data.frame(week=c(37,   38, 39, 40, 41, 42, 43, 44, 45, 46, 
                          47,   48, 49, 50, 51, 52, 1,  2,  3,  4,  5,  6,  
                          7,    8,  9,  10, 11, 12, 13, 14, 15, 16, 17, 18, 
                          19,   20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 
                          31,   32, 33, 34, 35, 36),

            values=c(21,    21, 25, 38, 21, 17, 20, 16, 9,  6,  6,  17, 36, 
                      52,   65, 79, 77, 87, 74, 72, 62, 79, 85, 114,    170,    178,    
                      141,  143,    118,    124,    112,    92, 76, 64, 62, 75, 63, 60,
                      76,   69, 60, 46, 42, 34, 23, 21, 19, 23, 23, 26, 24, 18),

            centred = c(-25, -24,-23,-22,-21,-20,-19,-18,-17,-16,-15,-14,-13,
                        -12,-11,-10,-9,-8,  -7, -6, -5, -4,-3,  -2, -1, 0,  1,  
                        2,  3,  4,  5,  6,  7,  8,  9, 10,  11, 12, 13, 14, 15, 
                        16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26))

我的最终数据集应该看起来像这样(头):

  week values centred
1   37     21     -25
2   38     21     -24
3   39     25     -23
4   40     38     -22
5   41     21     -21
6   42     17     -20

我完全不知道该怎么做。

任何帮助或想法将不胜感激。

干杯,

S

如果您有一个很长的列表,而您只是在列表中找到一个最大值,那么这可能有效:

mymax<-which.max(df$values)
len<-length(df$week)
df_fin<-cbind(df, centered= (-mymax+1):(-mymax+len))

新添加的栏目"centered"将有您想要的排名。这不会像您的 df_final 显示的那样循环使用周数,这可以通过添加 if 语句来实现。

现在,如果您需要回收利用,那么此部分可能适合您:

mymax<-which.max(df$values)
df2<-rbind(df, df)
if(mymax<26){
  mid=52+mymax
  dff<-df2[(mid-25):(mid+26),]
}else{
  mid=mymax
  dff<-df2[(mid-25):(mid+26),]
}
dff<-cbind(dff, centred=-25:26)