代码之家  ›  专栏  ›  技术社区  ›  firmo23

根据列的唯一级别修改数据帧,然后在其中组合其他2列的值

r
  •  0
  • firmo23  · 技术社区  · 2 年前

    我有下面的数据帧,我想以一种有3列的方式修改它 Election,Party_1 and Party_2 和党内专栏之间的粘贴 Candidate Voteshare

    df<-structure(list(ELECtion = c("PC_2009", "AC_2011", "PC_2014", 
    "AC_2016", "PC_2019", "AC_2021", "PC_2009", "AC_2011", "PC_2014", 
    "AC_2016", "PC_2019", "AC_2021"), Party = c("Party_1", "Party_1", 
    "Party_1", "Party_1", "Party_1", "Party_1", "Party_2", "Party_2", 
    "Party_2", "Party_2", "Party_2", "Party_2"), Candidate = c("Mr.Sen", 
    "Dr.Kar", "Mr. Sen", "Dr.Kar", "Dr.Reddy", "Dr.Kar", "Dr.Dutta", 
    "Mrs.Dondopani", "Mr. Das", "Mrs.Dondopani", "Mr,Das", "Mrs.Dondopani"
    ), Voteshare = c(0.2, 0.32, 0.12, 0.36, 0.005, 0.26, 0.15, 0.23, 
    0.45, 0.28, 0.54, 0.38)), row.names = c(NA, -12L), class = c("tbl_df", 
    "tbl", "data.frame"))
    

    喜欢

    enter image description here

    2 回复  |  直到 2 年前
        1
  •  1
  •   Maël    2 年前

    具有 paste + pivot_wider :

    library(tidyr)
    library(dplyr)
    df %>% 
      mutate(cand_vote = paste(Candidate, paste0(Voteshare * 100, "%")), .keep = "unused") %>% 
      pivot_wider(names_from = "Party", values_from = "cand_vote")
    
    #   ELECtion Party_1       Party_2          
    #   <chr>    <chr>         <chr>            
    # 1 PC_2009  Mr.Sen 20%    Dr.Dutta 15%     
    # 2 AC_2011  Dr.Kar 32%    Mrs.Dondopani 23%
    # 3 PC_2014  Mr. Sen 12%   Mr. Das 45%      
    # 4 AC_2016  Dr.Kar 36%    Mrs.Dondopani 28%
    # 5 PC_2019  Dr.Reddy 0.5% Mr,Das 54%       
    # 6 AC_2021  Dr.Kar 26%    Mrs.Dondopani 38%
    
        2
  •  1
  •   GuedesBF    2 年前

    我们可以 unite 将候选列和voteshare列合并到单个变量中,然后 pivot_wider 以传播数据。 scales::percent 很容易将分数转换为百分比。

    library(tidyr)
    library(dplyr)
    
    df |> 
        mutate(Voteshare = scales::percent(Voteshare)) |> 
        unite(c("Candidate", "Voteshare"),
              sep = " ",
              col = "value") |> 
        pivot_wider(names_from = Party,
                    values_from = value)
    
    # A tibble: 6 × 3
      ELECtion Party_1       Party_2            
      <chr>    <chr>         <chr>              
    1 PC_2009  Mr.Sen 20.0%  Dr.Dutta 15.0%     
    2 AC_2011  Dr.Kar 32.0%  Mrs.Dondopani 23.0%
    3 PC_2014  Mr. Sen 12.0% Mr. Das 45.0%      
    4 AC_2016  Dr.Kar 36.0%  Mrs.Dondopani 28.0%
    5 PC_2019  Dr.Reddy 0.5% Mr,Das 54.0%       
    6 AC_2021  Dr.Kar 26.0%  Mrs.Dondopani 38.0%