我有一些不整洁的数据。它有两个嵌套的重复测量(Q1 / Q2嵌套在Constructs中)。我想将它从宽格式转移到长格式。
## id time Q1..Ask Q2..Ask Q1..Tell Q2..Tell Q1..Respond Q2..Respond
## 1 1 pre 1 1 1 1 0 0
## 2 2 pre 0 1 1 0 0 1
## 3 3 pre 0 0 1 0 0 0
## 4 4 pre 1 1 0 1 1 0
## 5 5 pre 0 0 0 0 0 0
## 6 1 post 0 0 1 1 0 1
## 7 2 post 0 0 1 1 0 0
## 8 3 post 0 0 0 1 0 0
## 9 4 post 1 0 1 1 0 0
## 10 5 post 0 1 0 1 1 1
问题1和问题2(Q1和Q2)是针对同一构造的两个不同问题。所以Q1..Ask Q2..Ask
是针对Ask构造的问题1和2的得分。如何将Q1 / Q2放入列(Question
),将列标题的后半部分放入Construct
列,使用 tidyr <{1}}列STRONG>?
#MWE
Score
#代码使其长格式不在tidyr
if (!require("pacman")) install.packages("pacman")
pacman::p_load(dplyr, tidyr)
set.seed(10)
dat <- data_frame(
id = c(1:5, 1:5),
time = rep(c("pre", "post"), each = 5),
Q1..Ask = sample(0:1, 10, TRUE),
Q2..Ask = sample(0:1, 10, TRUE),
Q1..Tell = sample(0:1, 10, TRUE),
Q2..Tell = sample(0:1, 10, TRUE),
Q1..Respond = sample(0:1, 10, TRUE),
Q2..Respond = sample(0:1, 10, TRUE)
)
#Desired Output
Map(function(x, y) {
data_frame(
ID = rep(dat[["id"]], 2),
Time = rep(dat[["time"]], 2),
Question = rep(c("Q1", "Q2"), each=10),
Construct = rep(gsub("Q[12]\\.+", "", colnames(dat)[x]), 20),
Score = c(dat[[x]], dat[[y]])
)
}, c(3, 5, 7), c(4, 6, 8)) %>%
rbind_all
答案 0 :(得分:6)
尝试
library(tidyr)
gather(dat, Var, Score, -id, -time) %>%
extract(Var, c('Question', 'Construct'),
'([^.]+)..([^.]+)')