簡體   English   中英

如何將多列長數據重塑為寬?

[英]How can I reshape multiple columns of long data to wide?

structure(tibble(c("top", "jng", "mid", "bot", "sup"), c("369", "Karsa", "knight", "JackeyLove", "yuyanjia"), 
           c("Malphite", "Rek'Sai",  "Zoe", "Aphelios", "Braum"), c("1", "1", "1", "1", "1"), c("7", "5", "7", "5", "0"), 
           c("6079-7578", "6079-7578", "6079-7578", "6079-7578", "6079-7578")), .Names = c("position", "player", "champion", "result", "kills", "gameid"))

輸出:

# A tibble: 5 x 6
  position player     champion result kills gameid   
* <chr>    <chr>      <chr>    <chr>  <chr> <chr>    
1 top      369        Malphite 1      7     6079-7578
2 jng      Karsa      Rek'Sai  1      5     6079-7578
3 mid      knight     Zoe      1      7     6079-7578
4 bot      JackeyLove Aphelios 1      5     6079-7578
5 sup      yuyanjia   Braum    1      0     6079-7578

我想要的輸出是:

structure(list(gameid = "6079-7578", result = "1", player_top = "369", 
    player_jng = "Karsa", player_mid = "knight", player_bot = "JackeyLove", 
    player_sup = "yuyanjia", champion_top = "Malphite", champion_jng = "Rek'Sai", 
    champion_mid = "Zoe", champion_bot = "Aphelios", champion_sup = "Braum", 
    kills_top = "7", kills_jng = "5", kills_mid = "7", kills_bot = "5", 
    kills_sup = "0"), row.names = c(NA, -1L), class = c("tbl_df", 
"tbl", "data.frame")) 

看起來像這樣:

     gameid result player_top player_jng player_mid player_bot player_sup champion_top champion_jng champion_mid champion_bot champion_sup
1 6079-7578      1        369      Karsa     knight JackeyLove   yuyanjia     Malphite      RekSai          Zoe     Aphelios        Braum
  kills_top kills_jng kills_mid kills_bot kills_sup
1         7         5         7         5         0

我知道我應該使用pivot_wider() 和drop_na 之類的東西,但我不知道如何使用多個列執行pivot_wider() 並同時折疊行。 任何幫助,將不勝感激。

您可以pivot_wider()使用pivot_wider() ,將“位置”變量定義為新列名稱來自names_from的變量,以及三個變量,其中包含要用於填充這些列的值 as values_from

默認情況下,多個values_from變量被粘貼到新列名稱的前面。 這可以改變,但在這種情況下,匹配你想要的命名結構。

原始數據集中的所有其他變量將按照它們出現的順序用作id_cols

library(tidyr)
pivot_wider(dat,  
            names_from = "position", 
            values_from = c("player", "champion", "kills"))
#>   result    gameid player_top player_jng player_mid player_bot player_sup
#> 1      1 6079-7578        369      Karsa     knight JackeyLove   yuyanjia
#>   champion_top champion_jng champion_mid champion_bot champion_sup kills_top
#> 1     Malphite      Rek'Sai          Zoe     Aphelios        Braum         7
#>   kills_jng kills_mid kills_bot kills_sup
#> 1         5         7         5         0

您可以通過id_cols顯式寫出它們來控制輸出中 id 列的順序。 這是一個示例,匹配您想要的輸出。

pivot_wider(dat, id_cols = c("gameid", "result"), 
            names_from = "position", 
            values_from = c("player", "champion", "kills"))
#>      gameid result player_top player_jng player_mid player_bot player_sup
#> 1 6079-7578      1        369      Karsa     knight JackeyLove   yuyanjia
#>   champion_top champion_jng champion_mid champion_bot champion_sup kills_top
#> 1     Malphite      Rek'Sai          Zoe     Aphelios        Braum         7
#>   kills_jng kills_mid kills_bot kills_sup
#> 1         5         7         5         0

reprex 包( v2.0.0 ) 於 2021 年 6 月 24 日創建

在這里使用data.table可能會有所幫助。 dcast()每一行都由一個唯一的 gameid 和 result 組合標識,列將按位置分布,並填充 value.var 中列出的變量的值。

library(data.table)
library(dplyr)
df <- structure(tibble(c("top", "jng", "mid", "bot", "sup"), c("369", "Karsa", "knight", "JackeyLove", "yuyanjia"), 
                 c("Malphite", "Rek'Sai",  "Zoe", "Aphelios", "Braum"), c("1", "1", "1", "1", "1"), c("7", "5", "7", "5", "0"), 
                 c("6079-7578", "6079-7578", "6079-7578", "6079-7578", "6079-7578")), .Names = c("position", "player", "champion", "result", "kills", "gameid"))

df2 <- dcast(setDT(df), gameid + result~position, value.var = list('player','champion','kills'))

暫無
暫無

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

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