2017-09-14 30 views
2

我很茫然,我覺得我好像在找到答案......但我一直無法這樣做。我真的不知道從哪裏開始從計算結果中重新創建名單(選票)

我從排名投票結果: 這說明有多少票(100個選民)每名候選人(5名候選人),每個地方有(重複性的數據是在底部):

Name 1st 2nd 3rd 4th 5th 
Can1 50 0 15 25 10 
Can2 15 25 0 10 50 
Can3 25 50 10 0 15 
Can4 0 10 50 15 25 
Can5 10 15 0 0 0 

我試圖重新從結果票,100票像這樣(另外,一些選票沒有被完全填滿):

Ballot1: Can1, Can3, Can4, Can5, Can2 
Ballot2: Can1, Can3, Can5 
Ballot3: Can3, Can5, Can2, Can1, Can4 
... 
Ballot100: Can2, Can5, Can1, Can4 

我需要60名候選人,更要做到這一點超過1000票。


voting.results <- structure(list(X1 = c("Can1", "Can2", "Can3", "Can4", "Can5"), 
`1place` = c(50L, 15L, 25L, 0L, 10L), `2place` = c(0L, 25L, 
50L, 10L, 15L), `3place` = c(15L, 0L, 10L, 50L, 0L), `4place` = c(25L, 
10L, 0L, 15L, 0L), `5place` = c(10L, 50L, 15L, 25L, 0L)), .Names = c("X1", 
"1place", "2place", "3place", "4place", "5place"), class = "data.frame", row.names = c(NA, 
-5L), spec = structure(list(cols = structure(list(X1 = structure(list(), class = c("collector_character", 
"collector")), `1place` = structure(list(), class = c("collector_integer", 
"collector")), `2place` = structure(list(), class = c("collector_integer", 
"collector")), `3place` = structure(list(), class = c("collector_integer", 
"collector")), `4place` = structure(list(), class = c("collector_integer", 
"collector")), `5place` = structure(list(), class = c("collector_integer", 
"collector"))), .Names = c("X1", "1place", "2place", "3place", 
"4place", "5place")), default = structure(list(), class = c("collector_guess", 
"collector"))), .Names = c("cols", "default"), class = "col_spec")) 
+1

什麼是選票的娛樂邏輯? –

+0

這不能完全解決。你可以模擬,但你仍然不會考慮事項,例如一些候選人更可能最終一起投票。 – Axeman

+0

關於娛樂邏輯...我並沒有真正想過。儘可能隨機分配。 @Axeman我認爲也許人們可以在第一名的正確位置爲每個人創造選票,而不是隨機化和很多if語句:如果can1在第一位,就像第二名一樣;跳過,否則在這裏寫名字(希望這可以理解)。並且對於每次迭代(每個地點),列表的隨機化。 我一直在想,也許使用創建suduko板的類似方法...但我不確定如何。 – Atius

回答

1

之初將是不錯的有這樣的數據集,每個候選人和他/她的所有演出。在voting.results之前的每一行(候選人,地點)重複發生的時間,下面做了什麼? df1是候選人的一些具體的地方。

library(magrittr);library(dplyr) 
df1 <- 
voting.results %>% 
    reshape2::melt() %>% 
    mutate(variable = as.integer(gsub("place","",variable))) %>% 
    rename(place=variable,can=X1) 
head(df1) 

# can place value 
# 1 Can1  1 50 
# 2 Can2  1 15 
# 3 Can3  1 25 
# 4 Can4  1  0 
# 5 Can5  1 10 
# 6 Can1  2  0 

df2是一個數據集,每個表現都有一行。

df2 <- 
    df1[ rep(row.names(df1), df1$value) , ] %>% 
    mutate(id = 1:n()) %>% 
    select(-value) %>% 
    arrange(place) 

head(df2) 

# can place id 
# 1 Can1  1 1 
# 2 Can1  1 2 
# 3 Can1  1 3 
# 4 Can1  1 4 
# 5 Can1  1 5 
# 6 Can1  1 6 

我們知道,所有的事件都有它的獲獎者,所以我們可以開始與第一個候選(假設沒有前qequo)每個單獨的事件。然後在每個for(e in 1:length(events))在其他地方添加候選人。添加的候選人從初始數據集中減去。 如果來自初始數據集的某些個人未分配(nrow(temp)>1),則重複該過程直至成功完成。

i <- 0 
temp <- data.frame(1) 

while(nrow(temp)>0){ 
    i <- i + 1 
    temp <- df2[ sample(1:nrow(df2)),] 
    events <- temp %>% filter(place==1) %>% split(1:nrow(.)) 

    for(e in 1:length(events)){ 
    for(p in sort(unique(temp$place))){ 

     inAlready <- events[[e]] 
     toInput <- 
     temp %>% 
     filter(!can %in% inAlready$can & place == p) %>% 
     .[1,] 

     events[[e]] <- rbind(inAlready , toInput) 

    } 

    events[[e]]$event <- e 

    idToExclude <- lapply(events , function(x) x$id) %>% unlist 
    temp %<>% filter(!id %in% idToExclude) 

    } 
} 

all <- 
    bind_rows(events) %>% 
    arrange(event, place) %>% 
    filter(!is.na(id)) 

我不知道它是否是完美的解決方案,需要多少迭代,但我希望這可以幫助您找到完美的解決方案。無論如何,可能有不止一個最終的解決方案,所以完美的重現性可能是不可能的。我很好奇,如果有一些類似運營研究的方法來解決這個問題。

享受和祝你好運!