从计数结果中重新创建列表(选票)

时间:2017-09-14 11:06:42

标签: r

我感到茫然,我觉得我好像找到了答案......但我无法这样做。我真的不知道从哪里开始

我有排名投票的结果: 它显示了每个候选人(5名候选人)获得的每个地方有多少票(100名选民)(可复制数据位于底部):

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 :(得分: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

我们知道所有活动都有它的优胜者,因此我们可以与第一个候选人一起发起每个单独的活动(假设没有前一个活动)。然后在每个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))

我不知道它是否是完美的解决方案,以及需要多少次迭代,但我希望这可以帮助您找到完美的解决方案。无论如何,可能有不止一个最终解决方案,因此完美的再现性是不可能的。我很好奇是否有一些类似于运营研究的方法来解决这个问题。

享受并祝你好运!