【发布时间】:2011-04-13 19:09:52
【问题描述】:
我有一个项目,我需要能够在 R 中计算不同的投票权指数。作为第一次尝试,我编写了一个小函数来计算 banzhaf 指数。它需要两个参数,一个数据框有两列必须标记为成员和投票,以及需要多少票才能获得多数票(配额):
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() 函数(我认为)。有谁知道如何让它运行得更快?
最好的,托马斯
P.S:如果您想对其进行测试,请使用以下数据,但请注意它可能会永远运行!
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
【问题讨论】:
-
四个嵌套的
for循环?哇哦。这四个太多了。 -
函数不起作用,因为
piv没有在score[length(piv) + 1]中定义。 -
感谢 Joshua,为了便于阅读,我在发布时重命名了一些矢量,但我忘了更改那个。现在完成。
标签: r function permutation voting-system