Ошибка при использовании изменения формы для реструктуризации данных из широких в длинные данные с несколькими столбцами

Я пытаюсь реструктурировать свои данные с помощью reshape из широкого формата в длинный, но постоянно получаю сообщение об ошибке. Ниже я написал код, который я уже пробовал, и сообщение об ошибке, которое я получаю.

текущая структура данных

patientid  Adh_catv1    Adh_catv2    Adh_catv3    Adh_threeitemsv1   Adh_threeitemsv2  Adh_threeitemsv3
70FD       optimal      optimal      optimal      86                 90                100
70LJ       suboptimal   suboptimal   optimal      40                 50                70
70ML       optimal      suboptimal   suboptimal   89                 55                50        

желаемая структура

patientid  Visits    Adherence    Adherence_threeitem
70FD       visit1   optimal        86
70FD       visit2   optimal        90
70FD       visit3   optimal        100
70LJ       visit1   suboptimal     40
70LJ       visit2   suboptimal     50
70LJ       visit3   optimal        70
70ML       visit1   optimal        89
70ML       visit2   suboptimal     55
70ML       visit3   suboptimal     50

Это то, что я пробовал до сих пор


    reshape(df, direction = 'long',
        varying = c ('adh_catv1:Adh_threeitemsv3'),
        timevar = 'Visits',
        times = c ("visit1","visit2","visit3"),
        v.names = c ('adherence','adherence_threeitem),
        idvar = 'patientid')

Error in reshape(df, direction = "long", varying = c("adh_catv1:Adh_threeitemsv3"),  : 
  length of 'varying' must be the product of length of 'v.names' and length of 'times'

Пожалуйста, сообщите, что я делаю неправильно в приведенном выше коде, или предложите альтернативный более простой вариант с использованием других функций.


person Thandeka    schedule 21.04.2021    source источник
comment
У вас есть лишний пробел между c и (   -  person Elle    schedule 21.04.2021
comment
просто выполните varying =-1, так как единственный столбец, который не меняется, - это первый:   -  person Onyambu    schedule 21.04.2021


Ответы (1)


Самый простой код здесь:

reshape(df,-1, dir="long", sep="")

    patientid time   Adh_catv Adh_threeitemsv id
1.1      70FD    1    optimal              86  1
2.1      70LJ    1 suboptimal              40  2
3.1      70ML    1    optimal              89  3
1.2      70FD    2    optimal              90  1
2.2      70LJ    2 suboptimal              50  2
3.2      70ML    2 suboptimal              55  3
1.3      70FD    3    optimal             100  1
2.3      70LJ    3    optimal              70  2
3.3      70ML    3 suboptimal              50  3

Вы можете добавить другие переменные, чтобы они были такими, как вы хотите:

person Onyambu    schedule 21.04.2021
comment
Г-н Онямбу, могу я спросить, как мы можем воспроизвести тот же вывод с помощью pivot_longer? - person Anoushiravan R; 21.04.2021
comment
@AnoushiravanR основной код pivot_longer будет df%>%pivot_longer(-patientid, names_to = c(".value", "Visits"), names_pattern="(.*)(\\d+)") - person Onyambu; 21.04.2021
comment
Большое спасибо. Я боролся с аргументом names_sep и не понимал, что должен был использовать вместо него names_pattern. Я думаю, мне нужно улучшить свои знания регулярных выражений. - person Anoushiravan R; 21.04.2021
comment
@AnoushiravanR, вы все еще можете использовать name_sep вместо name_pattern. т.е. просто используйте names_sep="(?<=\\D)(?=\\d)" - person Onyambu; 21.04.2021
comment
Могу я спросить, что на самом деле представляет это регулярное выражение? Очень жаль, что мои познания в этой области оставляют желать лучшего. - person Anoushiravan R; 21.04.2021
comment
@AnoushiravanR только что использовал просмотр назад, т.е. (?<=\D) означает, что последнее совпадающее значение не является цифрой. Затем используется просмотр вперед (?=\d), что означает, что следующее значение является цифрой. Если вы посмотрите на имена широкого фрейма данных, разделитель должен быть между символами и цифрами. - person Onyambu; 21.04.2021
comment
Большое спасибо, мистер Онямбу. Вы один из моих источников вдохновения, чтобы каждый день узнавать больше о R. - person Anoushiravan R; 21.04.2021
comment
@AnoushiravanR просмотрел вашу работу, и это приятно. вы будете знать, в долгосрочной перспективе - person Onyambu; 21.04.2021
comment
Спасибо Вам большое. Для меня большая честь получать такие теплые слова. Прошел почти год, и я изучаю R, так как он мне нужен для будущих исследований (сектор цепочки поставок). До сих пор мне это очень нравилось, и я надеюсь, что смогу использовать его в своей будущей работе. Еще раз спасибо за проверку моих кодов. Я также был бы рад, если бы я мог быть среди вашей сети linkedin. - person Anoushiravan R; 21.04.2021