วิธีการขยาย data frame ใน R


15

ฉันมีปัญหาต่อไปนี้ขณะทำการวิเคราะห์กับ R

ฉันมีชื่อไฟล์แบบนี้:

Name | Group | Count
Person 1 | A | 3
Person 2 | A | 1
Person 3 | A | 0
Person 1 | B | 5 
Person 2 | B | 0
Person 3 | B | 1
Person 1 | C | 1

และฉันจะต้อง "ขยาย" มัน (ไม่แน่ใจว่าคำที่ถูกต้อง) เป็นเช่นนี้:

Person 1 | A
Person 1 | A
Person 1 | A
Person 2 | A
Person 1 | B
Person 1 | B

เป็นต้น

ดังนั้นจึงต้องใช้ค่าของคู่คนที่ 1 และ A (ในตัวอย่างนี้ 3) และทำให้สามแถวกับบุคคลที่ 1 และ A และทำเช่นนั้นสำหรับทุกคน - กลุ่ม - การรวมตัวกัน ไม่สามารถหาคำที่ดีสำหรับการค้นหาออนไลน์ได้



คุณควรสำรวจreshape2แพคเกจใน R มันอาจช่วยให้dput2 ตัวอย่าง dataframes: หนึ่งที่มีการป้อนข้อมูลและหนึ่งที่มีการส่งออก
Zach

ฉันให้คำตอบ แต่ฉันเดาว่านี่เป็นคำถามการเขียนโปรแกรม R มากกว่าคำถามเชิงสถิติดังนั้นบางทีมันควรจะย้ายไปที่อื่น
Gala

ขอบคุณGaëlสำหรับคำตอบและช่วยเหลือในการจัดรูปแบบในคำถามของฉัน
Juha-Matti S.

คำตอบ:


10

ในขณะที่มันเป็นแพคเกจที่มีประโยชน์มากฉันคิดว่าการก่อร่างใหม่มากเกินไปในกรณีนี้ตัวแทนสามารถทำงานได้

นี่คือตัวอย่างข้อมูล:

df <- data.frame(
     name=c("Person 1", "Person 2", "Person 3", "Person 1", "Person 2", "Person 3"),
     group=c("A", "A", "A", "B", "B", "B"),
     count=c(3,1,0,5,0,1))

ตอนนี้เพื่อ "ขยาย" มัน:

expanded <- data.frame(name = rep(df$name, df$count),
                       group = rep(df$group, df$count))

ฉันไม่สามารถหาวิธีการทำงานโดยตรงบน data frame ที่อยู่ด้านบนของหัวของฉันดังนั้นฉันจึงทำงานกับตัวแปรแต่ละตัวแยกกันจากนั้นประกอบเข้าด้วยกันอีกครั้งซึ่งค่อนข้างน่าเกลียด แต่ควรจะใช้ได้ตราบใดที่คุณดูแลเสมอ ตัวแปรเดียวกันสำหรับการนับ


7
วิธีการเกี่ยวกับเรื่องนี้: df[rep(seq_len(nrow(df)), df$count), 1:2]?
chl

@chl คุณยอดเยี่ยมมาก!
Chris

15

คุณสามารถใช้ฟังก์ชั่นที่ไม่สามารถใช้ได้จากแพ็คเกจ reshape

ป.ร. ให้ไว้ข้างต้น (โดย @ Gaël Laurans)

library(reshape)

expanded<-untable(df[,c(1,2)], num=df[,3])

name group
1   Person 1     A
1.1 Person 1     A
1.2 Person 1     A
2   Person 2     A
4   Person 1     B
4.1 Person 1     B
4.2 Person 1     B
4.3 Person 1     B
4.4 Person 1     B
6   Person 3     B

untableทำสิ่งที่ฉันพูดถึงในความคิดเห็นของฉัน :-) ขอบคุณที่เตือนฉันเกี่ยวกับฟังก์ชันนั้น!
chl

1

และuncountจากtidyrนี้ให้ผลลัพธ์เช่นเดียวกับข้างต้น

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