У меня есть проект, в котором мне нужно иметь возможность рассчитывать различные индексы голосов в R. Для первой попытки я написал небольшую функцию для расчета индекса Бэнжафа.Он принимает два аргумента: информационный фрейм с двумя столбцами, который должен быть помечен как член и голос, и сколько голосов необходимо для большинства (квота):
library(combinat)
banzhaf <- function(data,quota){
f <- vector()
m <- vector()
score <- vector()
name <- vector()
pivot <- vector()
for (n in 1:nrow(data)){
y <- as.matrix(combn(data$member,n))
for (i in 1:ncol(y)){
for ( j in 1:n){
f[j] <- data[data$member == y[j,i],]$vote
m[j] <- as.character(data[data$member == y[j,i],]$member)
o <- data.frame(member = m, vote = f)
}
if (sum(o$vote) >= quota){
for (k in 1:length(o$member)){
t <- o[-k,]
if (sum(t$vote) < quota){
pivot[length(pivot) + 1] <- as.character(o$member[k])
}
}
}
}
}
for (l in unique(pivot)){
score[length(score) + 1] <- sum(pivot == l)
name[length(name) + 1] <- l
}
out <- data.frame(name = name, score = score/length(pivot))
return(out)
}
Проблема с этой функцией заключается в том, что она становитсяневероятно медленный, когда у меня более 8 членов в датафрейме.Это связано с функцией combn (), используемой в самом внешнем цикле (я думаю).Кто-нибудь знает, как сделать так, чтобы он работал быстрее?
Best, Thomas
PS: Если вы хотите протестировать его, используйте следующие данные, но знайте, что он может работать вечно!
x <- c("Germany","France","UK","Italy","Spain","Poland","Romania","Netherlands","Greece","Portugal","Belgium","Czech Rep.","Hungary","Sweden","Austria","Bulgaria","Denmark","Slovakia","Finland","Ireland","Lithuania","Latvia","Slovenia","Estonia","Cyprus","Luxembourg","Malta")
z <- c(29,29,29,29,27,27,14,13,12,12,12,12,12,10,10,10,7,7,7,7,7,4,4,4,4,4,3)
dat <- data.frame(member = as.character(x),vote = z)
oi <- banzhaf(dat, 255)
oi