簡體   English   中英

如何將每隔一行移動到 R 中的新列

[英]How to move every other row to a new column in R

我有一個數據框,應該顯示錦標賽的獲勝者和他們的對手。 目前,輸家在每隔一排。 所以,第 1 行是贏家,第 2 行是輸家,第 3 行是贏家,第 4 行是輸家,依此類推。

我希望獲勝者和他們的對手彼此相鄰,以便更容易看到誰與誰競爭。 棘手的部分是將每個人的健身房、姓名和參賽者編號保持在同一行中。

如何將每隔一行移動到一個新列,以便獲勝者和他們的對手在同一行?

y = read.csv('https://raw.githubusercontent.com/bandcar/Examples/main/y.csv')

# FAILED ATTEMPT
library(data.table)
z=dcast(setDT(y)[, grp := gl(.N, 2, .N)], grp ~ rowid(grp),
        value.var = setdiff(names(y), 'grp'))[, grp := NULL][]

請注意,兩張照片是不同的數據集

我的 df 目前的樣子:

我的 df 目前的樣子

類似於我想要的樣子: 我希望它看起來像什么

使用dplyr你可以這樣做:

library(dplyr)

read.csv('https://raw.githubusercontent.com/bandcar/Examples/main/y.csv') %>%
  group_by(fight, date) %>%
  summarise(division = first(division),
            competitor_1 = first(competitor),
            name_1 = first(name),
            competitor_2 = last(competitor),
            name_2 = last(name))
#> `summarise()` has grouped output by 'fight'. You can override using the
#> `.groups` argument.
#> # A tibble: 61 x 7
#> # Groups:   fight [26]
#>    fight    date                  division competitor_1 name_1    compe~1 name_2
#>    <chr>    <chr>                 <chr>           <int> <chr>       <int> <chr> 
#>  1 BYE      BYE                   Master 2            1 Rafael M~       1 Rafae~
#>  2 FIGHT 19 Thu 09/01 at 12:14 PM Master 2            2 Piter Fr~      63 Alan ~
#>  3 FIGHT 20 Thu 09/01 at 01:01 PM Master 2           16 Marques ~      55 Diego~
#>  4 FIGHT 20 Thu 09/01 at 12:13 PM Master 2           28 Kenned D~      44 Verge~
#>  5 FIGHT 22 Thu 09/01 at 12:27 PM Master 2            4 Marcus V~      52 Kian ~
#>  6 FIGHT 23 Thu 09/01 at 12:33 PM Master 2           30 Adam Col~      46 Steph~
#>  7 FIGHT 23 Thu 09/01 at 12:54 PM Master 2           31 Namrod B~      47 Stefa~
#>  8 FIGHT 23 Thu 09/01 at 12:58 PM Master 2           13 David Ch~      53 Joshu~
#>  9 FIGHT 24 Thu 09/01 at 01:08 PM Master 2            3 Sandro G~      56 Carlo~
#> 10 FIGHT 24 Thu 09/01 at 12:35 PM Master 2            8 Rafael R~      60 Andre~
#> # ... with 51 more rows, and abbreviated variable name 1: competitor_2

使用reprex v2.0.2創建於 2022-09-16

您的數據集存在一些問題,例如“FIGHT 22”有四個條目(根據您的描述,我預計有兩個條目)。

  division gender belt  weight fight    date                  competitor name                   gym                 
  <chr>    <chr>  <chr> <chr>  <chr>    <chr>                      <dbl> <chr>                  <chr>               
1 Master 2 Male   BLACK Middle FIGHT 22 Thu 09/01 at 12:27 PM          4 Marcus V. C. Antelante Ares BJJ            
2 Master 2 Male   BLACK Middle FIGHT 22 Thu 09/01 at 12:27 PM         62 Andrew E. Ganthier     Renzo Gracie Academy
3 Master 2 Male   BLACK Middle FIGHT 22 Thu 09/01 at 12:27 PM         11 Jimmy Dang Khoa Tat    CheckMat            
4 Master 2 Male   BLACK Middle FIGHT 22 Thu 09/01 at 12:27 PM         52 Kian Takumi Kadota     Brasa CTA           

第 26 場和第 35 場比賽也存在同樣的問題。假設這些問題已得到糾正,並假設奇數行包含贏家,偶數行包含輸家,以下代碼應該可以工作(使用 tidyverse):

y %>% 
    mutate(outcome = if_else(row_number() %% 2 == 1, "winner", "loser")) %>%     
    pivot_wider(names_from = outcome, values_from = c(competitor, name, gym)) 

這會讓你接近你想要的。 它添加了獲勝者列。 奇數指數為贏家,偶數指數為輸家。 為了美觀,我刪除了 BYE 周行。 然后我們按日期分組並戰斗並保留組合行中的所需數據,並將匯總列擴展為獲勝者失敗者信息。

library(dplyr)

y %>%
    mutate(
        winner = ifelse((y$X %% 2) == 0,'loser','winner')) %>%
    filter(date != 'BYE') %>%
    group_by(date, fight) %>% 
    summarise(division = first(division),
              belt = first(belt),
              weight = first(weight),
              gender = first(gender),
              winner.rank = first(competitor),
              winner = first(name),
              winner.gym = first(gym),
              opp.rank= last(competitor),
              opponent = last(name),
              opponent.gym = last(gym))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM