เกิดข้อผิดพลาดเมื่อใช้การปรับรูปร่างใหม่เพื่อปรับโครงสร้างข้อมูลจากข้อมูลกว้างไปเป็นข้อมูลยาวที่มีหลายคอลัมน์

ฉันกำลังพยายามปรับโครงสร้างข้อมูลของฉันใหม่โดยใช้ 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
คุณ Onyambu ฉันขอถามหน่อยว่าเราจะสร้างผลลัพธ์เดียวกันกับ 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 แทน ฉันเดาว่าฉันต้องปรับปรุงความรู้ regex ของฉัน - person Anoushiravan R; 21.04.2021
comment
@AnoushiravanR คุณยังคงสามารถใช้ name_sep แทน name_pattern ได้ คือแค่ใช้ names_sep="(?<=\\D)(?=\\d)" - person Onyambu; 21.04.2021
comment
ฉันขอถามได้ไหมว่า regex นี้แสดงถึงอะไรจริงๆ ฉันเสียใจมากที่ความรู้ของฉันในด้านนี้เหลือความต้องการมาก - person Anoushiravan R; 21.04.2021
comment
@AnoushiravanR เพิ่งใช้ lookbehind ie(?<=\D) หมายความว่าค่าที่จับคู่สุดท้ายไม่ใช่ตัวเลข จากนั้นใช้ lookahead (?=\d) ซึ่งหมายความว่าค่าถัดไปเป็นตัวเลข หากคุณดูที่ชื่อของ dataframe แบบกว้าง ตัวคั่นของคุณควรอยู่ระหว่างอักขระและตัวเลข - 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