通过两次重复措施,从长到宽

时间:2015-04-06 14:36:45

标签: r tidyr

我有一些不整洁的数据。它有两个嵌套的重复测量(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 

1 个答案:

答案 0 :(得分:6)

尝试

library(tidyr)
 gather(dat, Var, Score, -id, -time) %>% 
             extract(Var, c('Question', 'Construct'), 
                     '([^.]+)..([^.]+)')