วิธีหาผลรวมของกลุ่มเซลล์จากคอลัมน์หนึ่งตามเกณฑ์ที่ตรงกันในอีกคอลัมน์หนึ่ง [ทำซ้ำ]

ฉันมีข้อมูลที่มีลักษณะเช่นนี้

    Weight     Zip
    23         88762
    45.3       34957
    37.6       87293
    212.45     34957
    58.3       87293
    92.45      88762

ฉันกำลังพยายามรวมน้ำหนักที่ตรงกับรหัสไปรษณีย์เดียวกันและเพิ่มผลลัพธ์ลงในคอลัมน์ใหม่:

    TotalWeight
    115.45
    257.75
    95.9
    257.75 
    95.9 
    115.45

ฉันคิดว่าจะทำสิ่งนี้ แต่ฉันคิดว่าต้องมีอะไรที่มีประสิทธิภาพมากกว่านี้ ขอบคุณ!

weight <- c(23, 45.3, 37.6, 212.45, 58.3, 92.45)
zip <- c(88762L, 34957L, 87293L, 34957L, 87293L, 88762L)

function(){
zippop<-data.frame()
for (i in unique(zip)){
zippop<-rbind(zippop, c(i,sum(weight[which(zip==i)])))}
return (zippop)
}

person AffableAmbler    schedule 27.02.2016    source แหล่งที่มา
comment
โปรดทำให้ตัวอย่างของคุณทำซ้ำได้ นั่นคือ แทนที่จะแสดงเฉพาะข้อมูลของคุณ ให้สร้างส่วนเริ่มต้นของโค้ดของคุณขึ้นมา เช่น เช่นนั้น: weight <- c(23, 45.3, 37.6, 212.45, 58.3, 92.45) และ (สมมติว่าคุณต้องการให้ zip เป็นจำนวนเต็ม) zip <- c(88762L, 34957L, 87293L, 34957L, 87293L, 88762L)   -  person Glen_b    schedule 27.02.2016
comment
ฉันใช้เสรีภาพในการเพิ่มบรรทัดเหล่านั้นให้กับคุณ แต่ฟังก์ชันของคุณไม่สามารถเรียกใช้งานได้ทันที เนื่องจากเป็นเช่นนั้น ดังนั้นคุณจึงควรแก้ไขโค้ดของคุณต่อไป   -  person Glen_b    schedule 27.02.2016


คำตอบ (1)


ave() ใช้งานได้ที่นี่:

df <- data.frame(Weight=c(23,45.3,37.6,212.45,58.3,92.45),Zip=c(88762,34957,87293,34957,87293,88762));
df$TotalWeight <- ave(df$Weight,df$Zip,FUN=sum);
df;
##   Weight   Zip TotalWeight
## 1  23.00 88762      115.45
## 2  45.30 34957      257.75
## 3  37.60 87293       95.90
## 4 212.45 34957      257.75
## 5  58.30 87293       95.90
## 6  92.45 88762      115.45
person bgoldst    schedule 27.02.2016
comment
สิ่งที่ฉันต้องการ ขอบคุณมาก! - person AffableAmbler; 27.02.2016
comment
tapply (พร้อมฟังก์ชันผลรวม) ก็ใช้งานได้เช่นกัน - person Glen_b; 27.02.2016