จะเปลี่ยนข้อมูลระหว่างรูปแบบแบบกว้างและแบบยาวใน R ได้อย่างไร [ปิด]


32

คุณสามารถมีข้อมูลในรูปแบบกว้างหรือในรูปแบบยาว นี่เป็นสิ่งสำคัญเนื่องจากวิธีการใช้งานที่แตกต่างกันขึ้นอยู่กับรูปแบบ ฉันรู้ว่าคุณต้องทำงานกับmelt()และcast()จากแพคเกจการก่อร่างใหม่ แต่ดูเหมือนว่าบางสิ่งที่ฉันไม่ได้รับ

มีคนให้ภาพรวมสั้น ๆ กับฉันว่าคุณทำสิ่งนี้ได้อย่างไร


โปรดระบุตัวอย่างของสิ่งที่คุณต้องการบรรลุ สิ่งที่คุณไม่ได้รับ?
mpiktas

3
นี่คือการโพสต์บล็อกของฉันกับตัวอย่างของการใช้และmelt castมีการแปลงรูปแบบกว้างถึงยาวในขั้นตอนเดียว ไม่มีอะไรพิเศษอีกแล้วจริงๆ
mpiktas

ยินดีต้อนรับสู่สถิติ คุณอาจพบว่าช่วยให้มีชุดข้อมูลขนาดเล็กที่ทำซ้ำได้ในคำถามของคุณเพื่ออธิบายสิ่งที่คุณต้องการ อ่านsigmafield.org/2011/01/18/…เพื่อรับข้อมูลเพิ่มเติม
PaulHurleyuk

ดูคำถาม SO นี้ได้หลายวิธี
Axeman

คำตอบ:


26

มีแหล่งข้อมูลมากมายบนเว็บไซต์ของ Hadley Wickham สำหรับแพ็คเกจ (ตอนนี้เรียกว่าreshape2) รวมถึงลิงค์ไปยังกระดาษบนแพ็คเกจใน Journal of Statistics Software

นี่คือตัวอย่างสั้น ๆ จากกระดาษ:

> require(reshape2)
Loading required package: reshape2
> data(smiths)
> smiths
     subject time age weight height
1 John Smith    1  33     90   1.87
2 Mary Smith    1  NA     NA   1.54

เราทราบว่าข้อมูลอยู่ในรูปแบบกว้าง เพื่อไปยังแบบยาวเราสร้างsmithsdata frame molten :

> melt(smiths)
Using subject as id variables
     subject variable value
1 John Smith     time  1.00
2 Mary Smith     time  1.00
3 John Smith      age 33.00
4 Mary Smith      age    NA
5 John Smith   weight 90.00
6 Mary Smith   weight    NA
7 John Smith   height  1.87
8 Mary Smith   height  1.54

สังเกตว่าmelt()เลือกตัวแปรตัวใดตัวหนึ่งเป็น id ได้อย่างไร แต่เราสามารถระบุได้อย่างชัดเจนว่าจะใช้อะไรผ่านการโต้แย้ง'id':

> melt(smiths, id = "subject")
     subject variable value
1 John Smith     time  1.00
2 Mary Smith     time  1.00
3 John Smith      age 33.00
4 Mary Smith      age    NA
5 John Smith   weight 90.00
6 Mary Smith   weight    NA
7 John Smith   height  1.87
8 Mary Smith   height  1.54

นี่คืออีกตัวอย่างจาก?cast:

#Air quality example
names(airquality) <- tolower(names(airquality))
aqm <- melt(airquality, id=c("month", "day"), na.rm=TRUE)

หากเราเก็บกรอบข้อมูลหลอมเหลวเราสามารถส่งไปยังรูปแบบอื่น ๆ ในเวอร์ชันใหม่ของreshape(เรียกว่าreshape2) จะมีฟังก์ชั่นacast()และdcast()ส่งคืนผลลัพธ์ที่คล้ายกับอาร์เรย์ (อาร์เรย์เมทริกซ์เวกเตอร์) หรือเฟรมข้อมูลตามลำดับ ฟังก์ชั่นเหล่านี้ยังใช้ฟังก์ชั่นรวม (เช่นmean()) เพื่อให้ข้อมูลสรุปในรูปแบบหลอมเหลว ตัวอย่างเช่นจากตัวอย่างคุณภาพอากาศด้านบนเราสามารถสร้างค่าเฉลี่ยรายเดือนสำหรับตัวแปรในชุดข้อมูลในรูปแบบกว้าง

> dcast(aqm, month ~ variable, mean)
  month    ozone  solar.r      wind     temp
1     5 23.61538 181.2963 11.622581 65.54839
2     6 29.44444 190.1667 10.266667 79.10000
3     7 59.11538 216.4839  8.941935 83.90323
4     8 59.96154 171.8571  8.793548 83.96774
5     9 31.44828 167.4333 10.180000 76.90000

จริงๆมีเพียงสองฟังก์ชั่นหลักในreshape2: melt()และacast()และdcast()การจับคู่ ดูตัวอย่างในหน้าช่วยเหลือสำหรับทั้งสองฟังก์ชั่นดูเว็บไซต์ของ Hadley (ลิงค์ด้านบน) และดูกระดาษที่ฉันพูดถึง คุณควรเริ่มต้น

คุณอาจมองเข้าไปในplyrแพ็คเกจของ Hadley ที่ทำสิ่งที่คล้ายกันreshape2แต่ได้รับการออกแบบให้ทำสิ่งต่าง ๆ ได้มากกว่า


dcast(aqm, month ~ variable)สิ่งนี้จะทำอย่างไรหากไม่มีฟังก์ชันการรวม
qed

@CrystalSpirit มันจะส่งกลับจำนวนการสังเกตสำหรับแต่ละตัวแปร อ่าน?dcastสิ่งที่จะบอกคุณนี้ (ดูรายละเอียดการโต้แย้งfun.aggregate)
Reinstate Monica - G. Simpson

8
  • Quick-Rมีตัวอย่างง่ายๆของการใช้แพคเกจ reshape

  • ดูเพิ่มเติม?reshape( LINK ) สำหรับวิธี Base R ในการเคลื่อนย้ายระหว่างรูปแบบกว้างและยาว


7

คุณไม่จำเป็นต้องใช้และ meltcast

การปรับเปลี่ยนข้อมูลสามารถทำได้หลายวิธี ในตัวอย่างที่คุณอ้างถึงเมื่อใช้งานrecastด้วยaggregateซ้ำซ้อนเพราะaggregateงานนั้นดีด้วยตัวคุณเอง

aggregate(cbind(LPMVTUZ, LPMVTVC, LPMVTXC) ~ year, dtm, sum)
# or even briefer by first removing the columns you don't want to use
aggregate(. ~ year, dtm[,-2], sum)

ฉันชอบวิธีในการโพสต์บล็อกของคุณคุณอธิบายสิ่งที่meltกำลังทำ มีคนน้อยมากที่เข้าใจและเมื่อคุณเห็นมันจะง่ายขึ้นที่จะเห็นวิธีการcastทำงานและวิธีที่คุณอาจเขียนฟังก์ชั่นของคุณเองถ้าคุณต้องการ



2

เพิ่งสังเกตเห็นว่าไม่มีการอ้างอิงถึงวิธีการปรับแต่งที่มีประสิทธิภาพและครอบคลุมมากขึ้นในdata.tableที่นี้ดังนั้นฉันกำลังโพสต์โดยไม่ต้องแสดงความคิดเห็นเพิ่มเติมคำตอบที่ยอดเยี่ยมโดย Zach / Arun ใน StackOverflow สำหรับคำถามที่คล้ายกัน:

https://stackoverflow.com/questions/6902087/proper-fastest-way-to-reshape-a-data-table/6913151#6913151

และโดยเฉพาะอย่างยิ่งมีบทความสั้น ๆ ที่ยอดเยี่ยมในdata.tableหน้า GitHub:

https://github.com/Rdatatable/data.table/wiki/Getting-started

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.