Как правильно отформатировать данные моей панели в R?

#r #panel #reshape #melt

Вопрос:

Я знаю, что подобные вопросы существуют, но я перепробовал все, от плавления до изменения формы, до сложения и т. Д., И ничто не приближает меня даже близко.

Мои данные в настоящее время выглядят следующим образом:

 ID Treatment Round_1_Decision1 Round_1_Decision2 Round_2_Decision1 Round_2_Decision2 1 2 1 0 0 1 2 1 0 0 1 1  

Мне нужно, чтобы это выглядело так:

 ID Treatment Round Decision1 Decision2 1 2 1 1 0 1 2 2 0 1 2 1 1 0 0 2 1 2 1 1  

Есть какие-нибудь предложения?

Ответ №1:

Мы можем использовать pivot_longer — главное, что следует учитывать, — это names_to и names_pattern . Здесь нам нужен столбец «Round», который должен генерировать значения в качестве суффикса «Round» в имени столбца, а другой столбец-в качестве значения столбца ( .value ). В names_pattern подстроке «Захватить имена столбцов» в виде группы с группой захвата ( (...) ), т. е. — \w — должно соответствовать «Круглому», за которым следует _ , затем захватить цифры( (\d ) ), затем подчеркивание ( _ ), за которым следует следующая группа захвата ( (.* )), которая включает остальные символы для .value части

 library(tidyr) pivot_longer(df1, cols = starts_with("Round"),  names_to = c("Round", ".value"), names_pattern = "\w _(\d )_(.*)")  

-выход

 # A tibble: 4 × 5  ID Treatment Round Decision1 Decision2  lt;intgt; lt;intgt; lt;chrgt; lt;intgt; lt;intgt; 1 1 2 1 1 0 2 1 2 2 0 1 3 2 1 1 0 0 4 2 1 2 1 1  

данные

 df1 lt;- structure(list(ID = 1:2, Treatment = 2:1, Round_1_Decision1 = 1:0,   Round_1_Decision2 = c(0L, 0L),  Round_2_Decision1 = 0:1, Round_2_Decision2 = c(1L,   1L)), class = "data.frame", row.names = c(NA, -2L))  

Комментарии:

1. Вау, это было быстро. Это почти идеально работает, но у меня есть 20 раундов, и этот код сообщает только второе число (например, для 17-го раунда он просто показывает «7» в столбце «Раунд»). Как бы я это исправил?

2. @CameronKormylo вы можете изменить код на names_pattern = "\w (\d )_(.*)") . Есть ли в нем место между раундом и 17? В показанных данных не было никакого пробела, т. е. 17-го раунда. Если это так, то код должен работать без каких-либо изменений, т. е. без какого-либо пробела между раундом и 17

3. Приносим извинения, истинное соглашение об именовании-Round_17_Decision1

4. @CameronKormylo в этом случае измените шаблон на "\w _(\d )_(.*)"

5. Спасибо. Это прекрасно работает. Я приму этот ответ, как только он мне позволит. Там написано, что я должен подождать еще 3 минуты.

Ответ №2:

Вот альтернативный подход без использования names_pattern аргументов

 library(tidyverse)  df %gt;%   pivot_longer(  cols=-c(ID, Treatment),  names_to = "Round",  values_to = "value"  ) %gt;%   mutate(Decision = str_sub(Round, -9, -1),  Round = parse_number(Round)  ) %gt;%   pivot_wider(  names_from = Decision,  values_from = value  )  
 ID Treatment Round Decision1 Decision2  lt;intgt; lt;intgt; lt;dblgt; lt;intgt; lt;intgt; 1 1 2 1 1 0 2 1 2 2 0 1 3 2 1 1 0 0 4 2 1 2 1 1