【问题标题】:How to allocate tickets如何分配门票
【发布时间】:2020-11-30 05:43:14
【问题描述】:

我有两个文件:

  1. 类别:
Category_File = data.frame(c("A","A","A","A","A","B","B","B","C","C","D","D")) 
colnames(Category_File)= c("Category")
  1. 代理:
Agent_File = data.frame(c("A","A","B","B","C"),c("X","Y","X","Z","Y"),c(2,2,2,1,2))
colnames(Agent_File) = c("Category","Agent","Tickets")

我需要根据他们的类别数分配代理。

期望的输出:

outputfile = data.frame(c("A","A","A","A","A","B","B","B","C","C","D","D"),c("X","X","Y","Y","NA","X","X","Z","Z","Y","NA","NA"))
colnames(outputfile) = c("Category","Agent")

谢谢

【问题讨论】:

  • 您显示的所需输出会出错。你能纠正一下吗?
  • 更正请帮助

标签: r dplyr tidyverse


【解决方案1】:

这行得通吗:

library(dplyr)
library(tidyr)
Agent_File %>% uncount(Tickets)
    Category Agent
1          A     X
1.1        A     X
2          A     Y
2.1        A     Y
3          B     X
3.1        B     X
4          B     Z
5          C     Y
5.1        C     Y

您可以通过以下方式重置索引:

output <- Agent_File %>% uncount(Tickets)
row.names(output) <- NULL
output
  Category Agent
1        A     X
2        A     X
3        A     Y
4        A     Y
5        B     X
6        B     X
7        B     Z
8        C     Y
9        C     Y

【讨论】:

  • Category_File = data.frame(c("A","A","A","A","B","B","B","C","C ","D","D","A")) 我们需要为 "D" "D" 和 "A" 添加 "NA",因为我们没有足够的代理
  • @KalyanPavan,你能更新问题吗?我查看了您的数据和您的预期输出。
【解决方案2】:

你可以数extra_rows你需要添加。

library(dplyr)
library(tidyr)

Category_File %>%
  count(Category) %>%
  left_join(Agent_File, by = 'Category') %>%
  group_by(Category) %>%
  summarise(n = first(n) - sum(Tickets, na.rm = TRUE)) %>%
  uncount(n) -> extra_rows


Agent_File %>%
  uncount(Tickets) %>%
  bind_rows(extra_rows) %>%
  arrange(Category) -> result
rownames(result) <- NULL

result
#   Category Agent
#1         A     X
#2         A     X
#3         A     Y
#4         A     Y
#5         A  <NA>
#6         B     X
#7         B     X
#8         B     Z
#9         C     Y
#10        C     Y
#11        D  <NA>
#12        D  <NA>

【讨论】:

    【解决方案3】:

    这正是您想要的输出。

    我在您的 NA 背后看到的唯一可能的解释是您正在跟踪 Agent_File 的行 ID。因此,首先我将这些 id 设置为显式。

    然后我只是加入两个数据框。

    library(dplyr)
    library(tidyr)
    af <- uncount(Agent_File, Tickets) %>% group_by(Category) %>% mutate(id = row_number()) %>% ungroup()
    cf <- Category_File %>% group_by(Category) %>% mutate(id = row_number()) %>% ungroup()
    
    left_join(cf, af, by = c("id", "Category")) %>% select(-id)
    
    #> # A tibble: 12 x 2
    #>    Category Agent
    #>    <chr>    <chr>
    #>  1 A        X    
    #>  2 A        X    
    #>  3 A        Y    
    #>  4 A        Y    
    #>  5 A        NA   
    #>  6 B        X    
    #>  7 B        X    
    #>  8 B        Z    
    #>  9 C        Y    
    #> 10 C        Y    
    #> 11 D        NA   
    #> 12 D        NA   
    

    【讨论】:

      【解决方案4】:

      我在Karthik提出的方案中添加了几行代码,如下

      #Create a dummy column in category file
      Category_File <- Category_File %>% 
        group_by(Category) %>% 
        mutate(rowid = paste(Category, row_number()))
      
      Agent_File %>% uncount(Tickets) %>% 
        group_by(Category) %>%
        mutate(rowid = paste(Category, row_number())) %>%
        right_join(Category_File, by = c("rowid"="rowid")) %>%
        arrange(rowid) %>%
        select(Category = Category.y, Agent)
      
      # A tibble: 12 x 2
         Category Agent
         <chr>    <chr>
       1 A        X    
       2 A        X    
       3 A        Y    
       4 A        Y    
       5 A        NA   
       6 B        X    
       7 B        X    
       8 B        Z    
       9 C        Y    
      10 C        Y    
      11 D        NA   
      12 D        NA  
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-07
        • 1970-01-01
        • 2018-02-28
        • 1970-01-01
        • 1970-01-01
        • 2022-06-12
        相关资源
        最近更新 更多