【问题标题】:Multiple columns and I want to rearrange these columns based on another column in R or Excel多列,我想根据 R 或 Excel 中的另一列重新排列这些列
【发布时间】:2020-06-08 20:53:15
【问题描述】:

我有这样的数据。对于R_fighter,我希望R_fighter 在获胜列中定义获胜者。

例如,这对第 5 行不满意,Petr Yan 赢得了战斗,但他在B_fighter。另外,我需要将R_KDB_KD 交换为第5 行,以及R_sig_strB_sig_str。我还有更多具有R_B_ 列属性的列,并且还需要将它们全部交换。

我需要在B_fighter 上切换获胜者的所有行。

附上我的数据样本:

R_fighter,B_fighter,R_KD,B_KD,R_SIG_STR.,B_SIG_STR.,win_by,weight,winner

Henry Cejudo,Marlon Moraes,0,0,90 of 171,57 of 119,KO/TKO,UFC Bantamweight Title Bout,Henry Cejudo

Valentina Shevchenko,Jessica Eye,1,0,8 of 11,2 of 12,KO/TKO,UFC Women's Flyweight Title Bout,Valentina Shevchenko

Tony Ferguson,Donald Cerrone,0,0,104 of 200,68 of 185,TKO - Doctor's Stoppage,Lightweight Bout,Tony Ferguson

Jimmie Rivera,Petr Yan,0,2,73 of 192,56 of 189,Decision - Unanimous,Bantamweight Bout,Petr Yan

Tai Tuivasa,Blagoy Ivanov,0,1,64 of 144,73 of 123,Decision - Unanimous,Heavyweight Bout,Blagoy Ivanov

Tatiana Suarez,Nina Ansaroff,0,0,75 of 142,48 of 99,Decision - Unanimous,Women's Strawweight Bout,Tatiana Suarez

Aljamain Sterling,Pedro Munhoz,0,0,174 of 349,105 of 265,Decision - Unanimous,Bantamweight Bout,Aljamain Sterling

Karolina Kowalkiewicz,Alexa Grasso,0,0,90 of 232,148 of 369,Decision - Unanimous,Women's Strawweight Bout,Alexa Grasso

Ricardo Lamas,Calvin Kattar,0,1,12 of 29,22 of 41,KO/TKO,Featherweight Bout,Calvin Kattar

Yan Xiaonan,Angela Hill,0,0,94 of 249,71 of 144,Decision - Unanimous,Women's Strawweight Bout,Yan Xiaonan

Bevon Lewis,Darren Stewart,0,0,31 of 84,30 of 73,Decision - Unanimous,Middleweight Bout,Darren Stewart

Eddie Wineland,Grigorii Popov,2,0,74 of 171,55 of 150,KO/TKO,Bantamweight Bout,Eddie Wineland

Katlyn Chookagian,Joanne Calderwood,0,0,82 of 221,112 of 266,Decision - Unanimous,Women's Flyweight Bout,Katlyn Chookagian

非常感谢:)

【问题讨论】:

    标签: r excel formatting data-cleaning data-processing


    【解决方案1】:

    您可以使用 R 中的 dplyr 包,它有很多功能来重塑数据。

    在你的情况下,你可以使用类似的东西:

    library(dplyr)
    mydata %>%
     mutate(R_fighter_new = winner,
            B_fighter_new = if_else(R_fighter == winner, B_fighter, R_fighter),
            R_KD_new = if_else(R_fighter == winner, R_KD, B_KD),
            B_KD_new = if_else(R_fighter == winner, B_KD, R_KD)) %>%
     select(R_fighter = R_fighter_new, B_fighter = B_fighter_new, R_KD = R_KD_new, B_KD = B_KD_new, winner)
    

    在最后一个 select 语句中,您可以在数据框中包含您想要的所有列。

    【讨论】:

      【解决方案2】:

      我们可以在dplyr中使用case_when

      library(dplyr)
      mydata %>%
          mutate(R_fighter_new = winner,
          B_fighter_new = case_when(R_fighter == winner ~ B_fighter,TRUE~ R_fighter),
          R_KD_new = case_when(R_fighter == winner~R_KD, TRUE ~ B_KD),
          B_KD_new = case_when(R_fighter == winner ~ B_KD, TRUE ~ R_KD)) %>%
          select(R_fighter = R_fighter_new, B_fighter = B_fighter_new, R_KD = R_KD_new, B_KD = B_KD_new, winner)
      

      【讨论】:

        【解决方案3】:

        您可以尝试使用这样的方法来交换多个列。首先,为每一行添加一个匹配号列。然后,pivot_longer 这样您就有了 R 与 B 的单列。此列将根据战斗机和获胜者的值进行交换。然后,要恢复原来的更宽格式,您可以使用pivot_wider。请注意,pivot_wider 会将“值”放在输出前面,因为它包含多个值(R 和 B 被移到了末尾)。

        library(tidyverse)
        
        df %>%
          mutate(match_no = row_number()) %>%
          pivot_longer(cols = R_fighter:B_SIG_STR., names_to = c("R_vs_B", ".value"), names_pattern = "(R|B)_(\\w+)") %>%
          mutate(R_vs_B = case_when(R_vs_B == "B" & fighter == winner ~ "R",
                                    R_vs_B == "R" & fighter != winner ~ "B",
                                    TRUE ~ R_vs_B)) %>%
          pivot_wider(id_cols = c(match_no, winner, win_by, weight), names_from = R_vs_B, values_from = fighter:SIG_STR)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-10-21
          • 2015-02-27
          • 2019-12-27
          • 1970-01-01
          • 2022-01-21
          • 1970-01-01
          • 2020-02-08
          相关资源
          最近更新 更多