Я хотел бы разделить, а затем объединить парный набор данных.

Мои данные выглядят так:

  idno Q2   variable time    value
1  561 56 tuconjoint    1     fait
2  562 56 tuconjoint    1     fait
3  561 56 tuconjoint    2     fait
4  562 56 tuconjoint    2     fait
5  561 56       tutv    1 non fait
6  562 56       tutv    1 non fait
7  561 56       tutv    2 non fait
8  562 56       tutv    2 non fait

Таким образом, он состоит из двух человек (idno), принадлежащих к одной паре (Q2), наблюдаемых в течение двух эпизодов (time) для двух разных переменных (tuconjoint и {{X4 }}).

Я пытаюсь разделить , а затем объединить два variables.

Я нашел первую часть:

split(dtAct, dtAct$variable) 

Это дает мне два списка.

Я пробовал это, и, похоже, он работает, но не дает мне плавного вывода:

split(dtAct, dtAct$variable) %>% as.data.frame()

Результат , который мне нужен, выглядит примерно так

     idno  Q2 time  variableA    valueA  variableB  valueB 
1    561  56   1    tuconjoint    fait    tutv      non fait
2    562  56   1    tuconjoint    fait    tutv      non fait
3    561  56   2    tuconjoint    fait    tutv      non fait
4    562  56   2    tuconjoint    fait    tutv      non fait

Есть подсказка?

dtAct = structure(list(idno = c(561, 562, 561, 562, 561, 562, 561, 562
), Q2 = c(56, 56, 56, 56, 56, 56, 56, 56), variable = structure(c(1L, 
1L, 2L, 2L, 3L, 3L, 4L, 4L), .Label = c("tuconjoint_1", "tuconjoint_2", 
"tutv_1", "tutv_2"), class = "factor"), value = c("fait", "fait", 
"fait", "fait", "non fait", "non fait", "non fait", "non fait"
)), row.names = c(NA, -8L), .Names = c("idno", "Q2", "variable", 
"value"), class = "data.frame")
3
giac 23 Дек 2015 в 13:16

2 ответа

Лучший ответ

Если вы создадите разделенный список

dtList <- split(dtAct, dtAct$variable)

Вы можете ссылаться на объекты списка как

dtList$tuconjoint
dtList$tutv

Чтобы вы могли объединить два фрейма данных вместе

dtRes <- merge(dtList$tuconjoint, dtList$tutv, by=c('idno','Q2','time'),
           suffixes = c('A','B'))

И результат будет

     idno Q2    time  variableA    valueA    variableB   valueB
  1  561  56    1     tuconjoint   fait      tutv        non fait
  2  561  56    2     tuconjoint   fait      tutv        non fait
  3  562  56    1     tuconjoint   fait      tutv        non fait
  4  562  56    2     tuconjoint   fait      tutv        non fait
2
Matteo Felici 23 Дек 2015 в 10:34

Мы можем попробовать

library(tidyr)
dt1 <- separate(dtAct, variable, into=c('var', 'time')) 
Reduce(function(...) merge(..., 
           by = c('idno', 'Q2', 'time')), split(dt1, dt1$var))
2
akrun 23 Дек 2015 в 10:20