Kesalahan saat menggunakan reshape untuk menyusun ulang data dari data lebar ke panjang dengan banyak kolom

Saya mencoba menyusun ulang data saya menggunakan reshape dari format lebar ke format panjang tetapi saya terus mendapatkan kesalahan. Di bawah ini saya menulis kode yang sudah saya coba dan pesan kesalahan yang saya dapatkan.

struktur data saat ini

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        

struktur yang diinginkan

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

Inilah yang saya coba sejauh ini


    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'

Mohon saran tentang kesalahan yang saya lakukan pada kode di atas atau sarankan opsi alternatif yang lebih mudah menggunakan fungsi lain.


person Thandeka    schedule 21.04.2021    source sumber
comment
Anda memiliki spasi tambahan antara c dan (   -  person Elle    schedule 21.04.2021
comment
lakukan saja varying =-1 karena satu-satunya kolom yang tidak bervariasi adalah kolom pertama:   -  person Onyambu    schedule 21.04.2021


Jawaban (1)


Kode paling dasar di sini adalah:

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

Anda dapat menambahkan variabel lain untuk mendapatkan yang Anda inginkan:

person Onyambu    schedule 21.04.2021
comment
Pak Onyambu, bolehkah saya bertanya bagaimana kami dapat mereproduksi keluaran yang sama dengan pivot_longer? - person Anoushiravan R; 21.04.2021
comment
@AnoushirawanR kode dasar pivot_longer adalah df%>%pivot_longer(-patientid, names_to = c(".value", "Visits"), names_pattern="(.*)(\\d+)") - person Onyambu; 21.04.2021
comment
Terima kasih banyak. Saya kesulitan dengan argumen names_sep dan tidak menyadari bahwa saya seharusnya menggunakan names_pattern sebagai gantinya. Saya kira saya harus meningkatkan pengetahuan regex saya. - person Anoushiravan R; 21.04.2021
comment
@AnoushirawanR Anda masih dapat menggunakan name_sep alih-alih name_pattern. yaitu cukup gunakan names_sep="(?<=\\D)(?=\\d)" - person Onyambu; 21.04.2021
comment
Bolehkah saya bertanya apa sebenarnya yang diwakili oleh regex ini? Saya sangat menyesal pengetahuan saya di bidang ini meninggalkan banyak hal yang diinginkan. - person Anoushiravan R; 21.04.2021
comment
@AnoushirawanR hanya menggunakan tampilan belakang, yaitu(?<=\D) berarti nilai terakhir yang cocok bukanlah angka. Kemudian digunakan lookahead (?=\d) yang artinya nilai selanjutnya adalah angka. Jika Anda melihat nama-nama kerangka data lebar, pemisahnya harus antara karakter dan angka - person Onyambu; 21.04.2021
comment
Terima kasih banyak Pak Onyambu. Anda adalah salah satu inspirasi saya di sini untuk mempelajari lebih lanjut tentang R setiap hari. - person Anoushiravan R; 21.04.2021
comment
@AnoushirawanR telah menyelesaikan pekerjaan Anda dan itu bagus. Anda akan tahu hal itu dalam jangka panjang - person Onyambu; 21.04.2021
comment
Terima kasih sekali. Merupakan suatu kehormatan bagi saya untuk menerima kata-kata baik seperti itu. Sudah hampir satu tahun dan saya belajar R karena saya membutuhkannya untuk studi masa depan (sektor rantai pasokan). Saya sangat menikmatinya sejauh ini dan saya harap saya dapat menggunakannya dalam pekerjaan saya di masa depan. Sekali lagi terima kasih telah memeriksa kode saya. Saya juga akan senang jika saya bisa menjadi salah satu jaringan linkedin Anda. - person Anoushiravan R; 21.04.2021