Здесь у меня есть решение data.table
.Сначала мы конвертируем df
в data.table:
library(data.table)
df <- data.frame(district = c("A", "B"),
party1 = c("Lab", "Con"),
votes1 = c(188, 200),
party2 = c("LD", "Lab"),
votes2 = c(140, 164),
party3 = c("Con", "LD"),
votes3 = c(23, 99))
setDT(df)# converting to data.table
Затем я конвертирую df из широкой в длинную форму x
, чтобы мы могли суммировать 'голоса' согласно 'району' и 'партии'
x <- melt(df,id.vars = "district", # Melting data to long
measure.vars = patterns("^party", "^votes"),
value.name = c("party", "votes"))
Что возвращает
#Displaying x
x
district variable party votes
1: A 1 Lab 188
2: B 1 Con 200
3: A 2 LD 140
4: B 2 Lab 164
5: A 3 Con 23
6: B 3 LD 99
Теперь я вычисляю y
- сумму в соответствии с районом и партией и фильтрую только требуемую партию "LD".
y <- x[party=="LD", .(SumV=sum(votes)), .(district, party)]
Наконец, я добавляю к столбцу SumV
с y
до df
.Я сортирую y
в соответствии с district
, чтобы избежать присвоения сумм LD различным округам.
df[ , LD_votes:= y[order(district),SumV]]
df
district party1 votes1 party2 votes2 party3 votes3 LD_votes
1: A Lab 188 LD 140 Con 23 140
2: B Con 200 Lab 164 LD 99 99
Аналогично вечеринкам Con и Lab
y <- x[party=="Lab", .(SumV=sum(votes)), .(district, party)]
df[ , Lab_votes:= y[order(district),SumV]]
y <- x[party=="Con", .(SumV=sum(votes)), .(district, party)]
df[ , Con_votes:= y[order(district),SumV]]
df
district party1 votes1 party2 votes2 party3 votes3 LD_votes Lab_votes Con_votes
1: A Lab 188 LD 140 Con 23 140 188 23
2: B Con 200 Lab 164 LD 99 99 164 200