基于偏斜周数的中心数据

时间:2016-03-01 14:41:55

标签: r data-manipulation

我有一个问题,我可以在2分钟内在excel中手动完成,但我需要将它合并到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周,所以我最终得到的值是1到42,高于第10周,-1到-9在第10周以下。

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

我完全不知道如何做到这一点。

非常感谢任何帮助或想法。

干杯,

取值

1 个答案:

答案 0 :(得分:0)

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

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

新添加的列&#34;居中&#34;将有你想要的排名。这不会像你的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)