Как взять сумму групп ячеек из одного столбца на основе критериев соответствия в другом столбце?

У меня есть данные, которые выглядят так.

    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