从长到长的数据转换

时间:2017-06-16 19:38:43

标签: r

我有一个广泛的数据集'我希望转换为非标准长格式的格式。至少,这就是我如何描述这个问题。

原始数据集模仿以下内容:

d1 <- data.frame('id' = c(1,2),
                 'Q1' = c(2,3),
                 'Q2' = c(1,3),
                 'Q3' = c(3,1))
d1
   id Q1 Q2 Q3
 1  1  2  1  3
 2  2  3  3  1 

在这个例子中,有两个人回答了三个问题。每个问题的答案采用以下值{1,2,3}。因此,在这个例子中,个人1回答了2到Q1,1到Q2,以及3回答了Q3。我现在需要转换成一个长期的&#39;采用以下格式的格式。对于每个人和每个可能的答案

d2 <- data.frame('id'= rep(seq(1:2),each=9),
                 'question' = rep(seq(1:3), each=3),
                 'option' = rep(seq(1:3)),
                 'choice' = 0)

d2
   id  question option choice
1   1         1      1      0
2   1         1      2      0
3   1         1      3      0
4   1         2      1      0
5   1         2      2      0
6   1         2      3      0
7   1         3      1      0
8   1         3      2      0
9   1         3      3      0
10  2         1      1      0
11  2         1      2      0
12  2         1      3      0
13  2         2      1      0
14  2         2      2      0
15  2         2      3      0
16  2         3      1      0
17  2         3      2      0
18  2         3      3      0

我正在努力的部分是如何合并&#39;或者&#39;重塑&#39;从d1到d2的数据,以便最终结果如下所示,选择列反映数据框d1中给出的答案:

   id question option choice
1   1         1      1      0
2   1         1      2      1
3   1         1      3      0
4   1         2      1      1
5   1         2      2      0
6   1         2      3      0
7   1         3      1      0
8   1         3      2      0
9   1         3      3      1
10  2         1      1      0
11  2         1      2      0
12  2         1      3      1
13  2         2      1      0
14  2         2      2      0
15  2         2      3      1
16  2         3      1      1
17  2         3      2      0
18  2         3      3      0

个人1未选择问题1中的选项1或3,但DID选择选项2中的虚拟编码中指示的选项2。

对此的任何想法都将不胜感激。

1 个答案:

答案 0 :(得分:2)

d3是最终输出。

d1 <- data.frame('id' = c(1,2),
                 'Q1' = c(2,3),
                 'Q2' = c(1,3),
                 'Q3' = c(3,1))

library(dplyr)
library(tidyr)

d2 <- d1 %>%
  gather(question, option, -id) 

d3 <- d2 %>%
  complete(id, question, option) %>%
  left_join(d2, by = c("id", "question")) %>%
  mutate(question = sub("Q", "", question)) %>%
  mutate(option.y = ifelse(option.y == option.x, 1, 0)) %>%
  rename(option = option.x, choice = option.y)

更新

这是一种更简洁的方法。 dt2是最终输出。

d2 <- d1 %>%
  gather(question, option, -id) %>%
  mutate(choice = 1) %>%
  complete(id, question, option, fill = list("choice" = 0)) %>%
  mutate(question = sub("Q", "", question))