#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-го раунда. Если это так, то код должен работать без каких-либо изменений, т. е. без какого-либо пробела между раундом и 173. Приносим извинения, истинное соглашение об именовании-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