Изменение формы посередине

В рамках пилотного опроса я представил каждому туркеру наборы вариантов выбора из четырех альтернатив. Данные выглядят следующим образом:

> so
  WorkerId pio_1_1 pio_1_2 pio_1_3 pio_1_4 pio_2_1 pio_2_2 pio_2_3 pio_2_4
1        1     Yes      No      No      No      No      No     Yes      No
2        2      No     Yes      No      No     Yes      No     Yes      No
3        3     Yes     Yes      No      No     Yes      No     Yes      No

Я бы хотел, чтобы они выглядели так:

WorkerId set pio1 pio2 pio3 pio4
       1   1  Yes   No   No   No
       1   2   No   No  Yes   No
...

Я могу разобраться с этим несколькими способами, ни один из которых не кажется очень элегантным:

  • Замена порядка чисел с помощью регулярных выражений и обратных ссылок а затем с помощью reshape()
  • Написание моей собственной маленькой функции для разбора первой цифры между символами подчеркивания и последующего изменения ее формы
  • Разделение и последующее размещение столбцов (зависит от правильного порядка)

Но кажется мне кажется, что все они игнорируют идею о том, что данные в том, что вы могли бы назвать «двойным широким» форматом, имеют свою собственную структуру. Я бы с удовольствием использовал для этого пакет reshape2, но, несмотря на то, что данные были созданы с помощью cast(), я не вижу никаких вариантов, которые помогли бы мне по-настоящему расплавить этот data.frame обратно.

Предложения приветствуются.

so <- structure(list(WorkerId = 1:3, pio_1_1 = structure(c(2L, 1L, 
2L),.Label = c("No", "Yes"), class = "factor"), pio_1_2 = structure(c(1L, 
2L, 2L),.Label = c("No", "Yes"), class = "factor"), pio_1_3 = structure(c(1L, 
1L, 1L),.Label = c("No", "Yes"), class = "factor"), pio_1_4 = structure(c(1L, 
1L, 1L),.Label = "No", class = "factor"), pio_2_1 = structure(c(1L, 
2L, 2L),.Label = c("No", "Yes"), class = "factor"), pio_2_2 = structure(c(1L, 
1L, 1L),.Label = c("No", "Yes"), class = "factor"), pio_2_3 = structure(c(2L, 
2L, 2L),.Label = c("No", "Yes"), class = "factor"), pio_2_4 = structure(c(1L, 
1L, 1L),.Label = "No", class = "factor")),.Names = c("WorkerId", 
"pio_1_1", "pio_1_2", "pio_1_3", "pio_1_4", "pio_2_1", "pio_2_2", 
"pio_2_3", "pio_2_4"), row.names = c(NA, 3L), class = "data.frame")
5
задан Ari B. Friedman 15 April 2012 в 11:55
поделиться