基于偏斜周数的中心数据
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)
我有一个问题,我可以在 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)