У меня есть набор данных с индивидуальными решениями, принятыми в группах. Для каждого человека мне нужна совокупная (скажем, сумма) всех решений членов его / ее группы. Допустим, данные выглядят так:
set.seed(123)
group_id <- c(sapply(seq(1, 3), rep, times = 3))
person_id <- rep(seq(1,3),3)
decision <- sample(1:10, 9, replace=T)
df <-data.frame(group_id, person_id, decision)
df
Результат:
group_id person_id decision
1 1 1 3
2 1 2 8
3 1 3 5
4 2 1 9
5 2 2 10
6 2 3 1
7 3 1 6
8 3 2 9
9 3 3 6
И мне нужно произвести что-то подобное:
group_id person_id decision others_decision
1 1 1 3 13
2 1 2 8 8
3 1 3 5 11
Так что дляНа каждый элемент группы я получаю всех остальных членов той же группы и что-то делаю (сумма). Я могу сделать это всего лишь с помощью цикла for
, но он кажется уродливым и неэффективным. Есть ли лучшие решения?
ОБНОВЛЕНИЕ:
Вот решение, которое я нашел до сих пор, извините за уродство:
df$other_decision=unlist(by(df, 1:nrow(df), function(row) {
df %>% filter(group_id==row$group_id, person_id!=row$person_id) %>% summarize(sum(decision))
}
))
df