【发布时间】:2020-06-03 08:36:08
【问题描述】:
我有一个数据框,其中包含某家医院的月度调查得分。每个月,我们存储医院获得的分数(_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]])
任何关于如何使用列名中的日期值更有效地执行此操作的提示将不胜感激。
【问题讨论】:
标签: r dplyr data-wrangling