我有一个数据框,其中包含某些医院的月度调查分数。每个月,我们存储医院获得的分数(_Score
列)和当月所有医院的相应平均分数(_Average
列)。
这是它的外观的简短示例-
df = data.frame(Hospital=c(rep("Hospital A",10),rep("Hospital B",10),rep("Hospital C",10),rep("Hospital D",10)),
Question=c(rep("Q1",40)),
key=c(rep(c("2020-01-31_Average","2020-01-31_Score","2020-02-29_Average","2020-02-29_Score",
"2020-03-31_Average","2020-03-31_Score","2020-04-30_Average","2020-04-30_Score",
"2020-05-31_Average","2020-05-31_Score"),4)),
value=c(round(runif(40,0,1),2)))
library(tidyr)
df = df %>% spread(key,value)
我想转换这个数据框,这样 -
1)前两列,Hospital
并Question
保持不变
2)仅保留最近三个月_Score
的列
3)_Average
保留最近一个月的列
4) 理想情况下,列需要从最旧到最近重新排序(即按以下顺序:Month M-2_Score
, Month M-1_Score
, Month M_Score
, Month M_Average
)
5)计算Variance
最后一列,即Score M和Score M-1之差
我想要达到的目标
使用 dplyr,这可以通过重新排序列来手动完成。但是我正在寻找一种方法来构建一种逻辑,该逻辑可以按照上述顺序自动重新排列最近 3 个月的列。通过获取列名中嵌入的日期值并根据它们重新排序。
结果表如下所示 -
#Final table
df_transformed = df %>%
select(1:2,8,10,12,11) %>%
mutate(Variance=.[[5]]-.[[4]])
任何有关如何使用列名中的日期值更有效地执行此操作的提示都将受到高度赞赏。