通过循环某些列来旋转更长的时间

问题描述 投票:0回答:1

我有以下属于我的飞镖联盟的宽格式数据

structure(list(home_team = c("Art of Dart", "Art of Dart", "Art of Dart", 
"Art of Dart", "Art of Dart", "Art of Dart", "Combolar", "Combolar", 
"Combolar", "Combolar", "Combolar", "Combolar"), home_player = c("Saygın \"Revolver\" Çakar", 
"Alpcan Mercan", "Sedat \"Y.E.S. Man\" Özel", "Ömer Öner", 
"Baho \"Kerberos\" Gullu", "Tolga \"Kabus\" Bora", "Ken \"MAC\" Macdonald", 
"Cem Canik", "Veli Güneş", "Ayaz Gürkan Akın", "Abidin Şimşek", 
"Şükrü \"Taylan\" Çakmak"), home_player_l1_darts = c(29, 
26, 21, 33, 27, 24, 29, 18, 27, 33, 30, 21), home_player_l1_remaining = c(0, 
60, 106, 16, 0, 55, 0, 0, 0, 0, 80, 104), home_player_l2_darts = c(24, 
21, 24, 33, 26, 21, 18, 21, 21, 27, 27, 23), home_player_l2_remaining = c(71, 
157, 97, 2, 0, 110, 68, 0, 25, 40, 15, 0), home_player_l3_darts = c(33, 
33, 31, 25, 30, 25, 18, 23, 21, 24, 21, 25), home_player_l3_remaining = c(0, 
32, 0, 0, 226, 0, 227, 0, 0, 113, 0, 0), home_player_l4_darts = c(33, 
NA, 24, 24, 28, 24, 30, NA, 33, 30, 24, 23), home_player_l4_remaining = c(10, 
NA, 74, 0, 0, 131, 5, NA, 32, 18, 144, 0), home_player_l5_darts = c(30, 
NA, NA, 27, NA, NA, NA, NA, 24, NA, NA, NA), home_player_l5_remaining = c(40, 
NA, NA, 76, NA, NA, NA, NA, 0, NA, NA, NA), home_score = c(2, 
0, 1, 2, 3, 1, 1, 3, 3, 1, 1, 3), away_score = c(3, 3, 3, 3, 
1, 3, 3, 0, 2, 3, 3, 1), away_team = c("EYT", "EYT", "EYT", "EYT", 
"EYT", "EYT", "Tost Makinesi", "Tost Makinesi", "Tost Makinesi", 
"Tost Makinesi", "Tost Makinesi", "Tost Makinesi"), away_player = c("Şenol Dilbaz", 
"Yavuz \"Speedy\" Çay", "Erdem \"The White\" Bakar", "Cem Başak", 
"Ömer Kaçar", "Hanifi \"Zeus\" Kaçar", "Elbruz \"Yetersiz\" Hanaşoğlu", 
"Mevlüt \"Doktor\" Bozdemir", "Mert \"The Bear\" Koçak", "Kanat Özenç", 
"Yener Koçak", "Eray Gürdoğan"), away_player_l1_darts = c(27, 
25, 24, 34, 27, 27, 30, 15, 27, 30, 27, 23), away_player_l1_remaining = c(89, 
0, 0, 0, 12, 0, 10, 318, 2, 33, 0, 0), away_player_l2_darts = c(27, 
22, 24, 32, 24, 19, 17, 21, 21, 29, 30, 21), away_player_l2_remaining = c(0, 
0, 0, 0, 173, 0, 0, 83, 0, 0, 0, 68), away_player_l3_darts = c(30, 
32, 33, 27, 33, 27, 21, 21, 21, 23, 18, 27), away_player_l3_remaining = c(32, 
0, 20, 195, 0, 39, 0, 150, 14, 0, 165, 4), away_player_l4_darts = c(36, 
NA, 23, 21, 27, 24, 28, NA, 33, 33, 24, 21), away_player_l4_remaining = c(0, 
NA, 0, 144, 101, 0, 0, NA, 0, 0, 0, 83), away_player_l5_darts = c(30, 
NA, NA, 27, NA, NA, NA, NA, 24, NA, NA, NA), away_player_l5_remaining = c(0, 
NA, NA, 0, NA, NA, NA, NA, 231, NA, NA, NA), home_player_l1_average = c(17.28, 
16.96, 18.81, 14.7, 18.56, 18.58, 17.28, 27.83, 18.56, 15.18, 
14.03, 18.9), home_player_l2_average = c(17.92, 16.38, 16.83, 
15.12, 19.27, 18.62, 24.06, 23.86, 22.67, 17.07, 18, 21.78), 
    home_player_l3_average = c(15.18, 14.21, 16.16, 20.04, 9.17, 
    20.04, 15.22, 21.78, 23.86, 16.17, 23.86, 20.04), home_player_l4_average = c(14.88, 
    NA, 17.79, 20.88, 17.89, 15.42, 16.53, NA, 14.21, 16.1, 14.88, 
    21.78), home_player_l5_average = c(15.37, NA, NA, 15.74, 
    NA, NA, NA, NA, 20.88, NA, NA, NA), away_player_l1_average = c(15.26, 
    20.04, 20.88, 14.74, 18.11, 18.56, 16.37, 12.2, 18.48, 15.6, 
    18.56, 21.78), away_player_l2_average = c(18.56, 22.77, 20.88, 
    15.66, 13.67, 26.37, 29.47, 19.9, 23.86, 17.28, 16.7, 20.62
    ), away_player_l3_average = c(15.63, 15.66, 14.58, 11.33, 
    15.18, 17.11, 23.86, 16.71, 23.19, 21.78, 18.67, 18.41), 
    away_player_l4_average = c(13.92, NA, 21.78, 17, 14.81, 20.88, 
    17.89, NA, 15.18, 15.18, 20.88, 19.9), away_player_l5_average = c(16.7, 
    NA, NA, 18.56, NA, NA, NA, NA, 11.25, NA, NA, NA), home_player_average = c(16.12, 
    15.85, 17.4, 17.29, 16.22, 18.16, 18.27, 24.49, 20.03, 16.13, 
    17.69, 20.63), away_player_average = c(16.01, 19.49, 19.53, 
    15.46, 15.44, 20.73, 21.9, 16.27, 18.39, 17.46, 18.7, 20.18
    ), home_win = c(0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1), away_win = c(1, 
    1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0), l1_gap = c(-89, 60, 106, 
    16, -12, 55, -10, -318, -2, -33, 80, 104), l2_gap = c(71, 
    157, 97, 2, -173, 110, 68, -83, 25, 40, 15, -68), l3_gap = c(-32, 
    32, -20, -195, 226, -39, 227, -150, -14, 113, -165, -4), 
    l4_gap = c(10, NA, 74, -144, -101, 131, 5, NA, 32, 18, 144, 
    -83), l5_gap = c(40, NA, NA, 76, NA, NA, NA, NA, -231, NA, 
    NA, NA)), row.names = c(NA, -12L), class = c("tbl_df", "tbl", 
"data.frame"))

我想旋转数据,以便我可以看到每场比赛的头对头结构,最多由五场比赛组成,显示每场比赛每个球员的平均分和剩余分数

最终数据应如下所示。

structure(list(match = c(1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 
4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 
9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12), 
    leg = c(1, 2, 3, 4, 5, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 
    1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 1, 2, 3, 4, 
    5, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4), p1_team = c("Art of Dart", 
    "Art of Dart", "Art of Dart", "Art of Dart", "Art of Dart", 
    "Art of Dart", "Art of Dart", "Art of Dart", "Art of Dart", 
    "Art of Dart", "Art of Dart", "Art of Dart", "Art of Dart", 
    "Art of Dart", "Art of Dart", "Art of Dart", "Art of Dart", 
    "Art of Dart", "Art of Dart", "Art of Dart", "Art of Dart", 
    "Art of Dart", "Art of Dart", "Art of Dart", "Art of Dart", 
    "Combolar", "Combolar", "Combolar", "Combolar", "Combolar", 
    "Combolar", "Combolar", "Combolar", "Combolar", "Combolar", 
    "Combolar", "Combolar", "Combolar", "Combolar", "Combolar", 
    "Combolar", "Combolar", "Combolar", "Combolar", "Combolar", 
    "Combolar", "Combolar", "Combolar", "Combolar"), p1 = c("Saygın \"Revolver\" Çakar", 
    "Saygın \"Revolver\" Çakar", "Saygın \"Revolver\" Çakar", 
    "Saygın \"Revolver\" Çakar", "Saygın \"Revolver\" Çakar", 
    "Alpcan Mercan", "Alpcan Mercan", "Alpcan Mercan", "Sedat \"Y.E.S. Man\" Özel", 
    "Sedat \"Y.E.S. Man\" Özel", "Sedat \"Y.E.S. Man\" Özel", 
    "Sedat \"Y.E.S. Man\" Özel", "Ömer Öner", "Ömer Öner", 
    "Ömer Öner", "Ömer Öner", "Ömer Öner", "Baho \"Kerberos\" Gullu", 
    "Baho \"Kerberos\" Gullu", "Baho \"Kerberos\" Gullu", "Baho \"Kerberos\" Gullu", 
    "Tolga \"Kabus\" Bora", "Tolga \"Kabus\" Bora", "Tolga \"Kabus\" Bora", 
    "Tolga \"Kabus\" Bora", "Ken \"MAC\" Macdonald", "Ken \"MAC\" Macdonald", 
    "Ken \"MAC\" Macdonald", "Ken \"MAC\" Macdonald", "Cem Canik", 
    "Cem Canik", "Cem Canik", "Veli Güneş", "Veli Güneş", 
    "Veli Güneş", "Veli Güneş", "Veli Güneş", "Ayaz Gürkan Akın", 
    "Ayaz Gürkan Akın", "Ayaz Gürkan Akın", "Ayaz Gürkan Akın", 
    "Abidin Şimşek", "Abidin Şimşek", "Abidin Şimşek", 
    "Abidin Şimşek", "Şükrü \"Taylan\" Çakmak", "Şükrü \"Taylan\" Çakmak", 
    "Şükrü \"Taylan\" Çakmak", "Şükrü \"Taylan\" Çakmak"
    ), p1_darts_l = c(29, 24, 33, 33, 30, 26, 21, 33, 21, 24, 
    31, 24, 33, 33, 25, 24, 27, 27, 26, 30, 28, 24, 21, 25, 24, 
    29, 18, 18, 30, 18, 21, 23, 27, 21, 21, 33, 24, 33, 27, 24, 
    30, 30, 27, 21, 24, 21, 23, 25, 23), p1_remaining_l = c(0, 
    71, 0, 10, 40, 60, 157, 32, 106, 97, 0, 74, 16, 2, 0, 0, 
    76, 0, 0, 226, 0, 55, 110, 0, 131, 0, 68, 227, 5, 0, 0, 0, 
    0, 25, 0, 32, 0, 0, 40, 113, 18, 80, 15, 0, 144, 104, 0, 
    0, 0), p1_score = c(2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 2, 
    2, 2, 2, 2, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 
    3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3), p2_score = c(3, 
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 
    1, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 2, 2, 2, 2, 2, 3, 3, 
    3, 3, 3, 3, 3, 3, 1, 1, 1, 1), p2_team = c("EYT", "EYT", 
    "EYT", "EYT", "EYT", "EYT", "EYT", "EYT", "EYT", "EYT", "EYT", 
    "EYT", "EYT", "EYT", "EYT", "EYT", "EYT", "EYT", "EYT", "EYT", 
    "EYT", "EYT", "EYT", "EYT", "EYT", "Tost Makinesi", "Tost Makinesi", 
    "Tost Makinesi", "Tost Makinesi", "Tost Makinesi", "Tost Makinesi", 
    "Tost Makinesi", "Tost Makinesi", "Tost Makinesi", "Tost Makinesi", 
    "Tost Makinesi", "Tost Makinesi", "Tost Makinesi", "Tost Makinesi", 
    "Tost Makinesi", "Tost Makinesi", "Tost Makinesi", "Tost Makinesi", 
    "Tost Makinesi", "Tost Makinesi", "Tost Makinesi", "Tost Makinesi", 
    "Tost Makinesi", "Tost Makinesi"), p2 = c("Şenol Dilbaz", 
    "Şenol Dilbaz", "Şenol Dilbaz", "Şenol Dilbaz", "Şenol Dilbaz", 
    "Yavuz \"Speedy\" Çay", "Yavuz \"Speedy\" Çay", "Yavuz \"Speedy\" Çay", 
    "Erdem \"The White\" Bakar", "Erdem \"The White\" Bakar", 
    "Erdem \"The White\" Bakar", "Erdem \"The White\" Bakar", 
    "Cem Başak", "Cem Başak", "Cem Başak", "Cem Başak", "Cem Başak", 
    "Ömer Kaçar", "Ömer Kaçar", "Ömer Kaçar", "Ömer Kaçar", 
    "Hanifi \"Zeus\" Kaçar", "Hanifi \"Zeus\" Kaçar", "Hanifi \"Zeus\" Kaçar", 
    "Hanifi \"Zeus\" Kaçar", "Elbruz \"Yetersiz\" Hanaşoğlu", 
    "Elbruz \"Yetersiz\" Hanaşoğlu", "Elbruz \"Yetersiz\" Hanaşoğlu", 
    "Elbruz \"Yetersiz\" Hanaşoğlu", "Mevlüt \"Doktor\" Bozdemir", 
    "Mevlüt \"Doktor\" Bozdemir", "Mevlüt \"Doktor\" Bozdemir", 
    "Mert \"The Bear\" Koçak", "Mert \"The Bear\" Koçak", "Mert \"The Bear\" Koçak", 
    "Mert \"The Bear\" Koçak", "Mert \"The Bear\" Koçak", "Kanat Özenç", 
    "Kanat Özenç", "Kanat Özenç", "Kanat Özenç", "Yener Koçak", 
    "Yener Koçak", "Yener Koçak", "Yener Koçak", "Eray Gürdoğan", 
    "Eray Gürdoğan", "Eray Gürdoğan", "Eray Gürdoğan"), 
    p2_darts_l = c(27, 27, 30, 36, 30, 25, 22, 32, 24, 24, 33, 
    23, 34, 32, 27, 21, 27, 27, 24, 33, 27, 27, 19, 27, 24, 30, 
    17, 21, 28, 15, 21, 21, 27, 21, 21, 33, 24, 30, 29, 23, 33, 
    27, 30, 18, 24, 23, 21, 27, 21), p2_remaining_l = c(89, 0, 
    32, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 195, 144, 0, 12, 173, 
    0, 101, 0, 0, 39, 0, 10, 0, 0, 0, 318, 83, 150, 2, 0, 14, 
    0, 231, 33, 0, 0, 0, 0, 0, 165, 0, 0, 68, 4, 83), p1_average_l = c(17.28, 
    17.92, 15.18, 14.88, 15.37, 16.96, 16.38, 14.21, 18.81, 16.83, 
    16.16, 17.79, 14.7, 15.12, 20.04, 20.88, 15.74, 18.56, 19.27, 
    9.17, 17.89, 18.58, 18.62, 20.04, 15.42, 17.28, 24.06, 15.22, 
    16.53, 27.83, 23.86, 21.78, 18.56, 22.67, 23.86, 14.21, 20.88, 
    15.18, 17.07, 16.17, 16.1, 14.03, 18, 23.86, 14.88, 18.9, 
    21.78, 20.04, 21.78), p2_average_l = c(15.26, 18.56, 15.63, 
    13.92, 16.7, 20.04, 22.77, 15.66, 20.88, 20.88, 14.58, 21.78, 
    14.74, 15.66, 11.33, 17, 18.56, 18.11, 13.67, 15.18, 14.81, 
    18.56, 26.37, 17.11, 20.88, 16.37, 29.47, 23.86, 17.89, 12.2, 
    19.9, 16.71, 18.48, 23.86, 23.19, 15.18, 11.25, 15.6, 17.28, 
    21.78, 15.18, 18.56, 16.7, 18.67, 20.88, 21.78, 20.62, 18.41, 
    19.9), p1_average = c(16.12, 16.12, 16.12, 16.12, 16.12, 
    15.85, 15.85, 15.85, 17.4, 17.4, 17.4, 17.4, 17.29, 17.29, 
    17.29, 17.29, 17.29, 16.22, 16.22, 16.22, 16.22, 18.16, 18.16, 
    18.16, 18.16, 18.27, 18.27, 18.27, 18.27, 24.49, 24.49, 24.49, 
    20.03, 20.03, 20.03, 20.03, 20.03, 16.13, 16.13, 16.13, 16.13, 
    17.69, 17.69, 17.69, 17.69, 20.63, 20.63, 20.63, 20.63), 
    p2_average = c(16.01, 16.01, 16.01, 16.01, 16.01, 19.49, 
    19.49, 19.49, 19.53, 19.53, 19.53, 19.53, 15.46, 15.46, 15.46, 
    15.46, 15.46, 15.44, 15.44, 15.44, 15.44, 20.73, 20.73, 20.73, 
    20.73, 21.9, 21.9, 21.9, 21.9, 16.27, 16.27, 16.27, 18.39, 
    18.39, 18.39, 18.39, 18.39, 17.46, 17.46, 17.46, 17.46, 18.7, 
    18.7, 18.7, 18.7, 20.18, 20.18, 20.18, 20.18), p1_win = c(0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 
    1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 
    0, 0, 0, 0, 0, 0, 1, 1, 1, 1), p2_win = c(1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 
    1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 
    1, 1, 0, 0, 0, 0), gap_l = c(-89, 71, -32, 10, 40, 60, 157, 
    32, 106, 97, -20, 74, 16, 2, -195, -144, 76, -12, -173, 226, 
    -101, 55, 110, -39, 131, -10, 68, 227, 5, -318, -83, -150, 
    -2, 25, -14, 32, -231, -33, 40, 113, 18, 80, 15, -165, 144, 
    104, -68, -4, -83)), row.names = c(NA, -49L), class = c("tbl_df", 
"tbl", "data.frame"))

这是通过以下 Stata 代码完成的

rename home_player* p1*
rename away_player* p2*
forval i=1/5{
rename *_l`i'_* *_*_l`i'
rename l`i'_* *_l`i'
}
rename home_* p1_*
rename away_* p2_*

gen match=_n
reshape long p1_darts_l p1_remaining_l p2_darts_l p2_remaining_l p1_average_l p2_average_l gap_l, i(match) j(leg)
drop if missing(p1_darts_l)
export 

drop *score

gen performance1=p1_average-p1_average_l
gen performance2=p2_average-p2_average_l
gen performance_dif12=p1_average-p2_average
logit p1_win performance1 performance2 performance_dif12

我想使用 tidyverse 重现这一点,任何帮助将不胜感激。预先感谢...

我尝试过多种AI解决方案。

r tidyverse stata tidyr reshape
1个回答
0
投票

这里有一种

tidyverse
方法来实现您想要的结果,首先进行一些重命名以获得一致的列名称,然后使用
tidyr::pivot_longer
进行重塑,最后再次进行一些重命名(home -> p1,...)并清理以摆脱 NA:

library(tidyr)
library(dplyr, warn.conflicts = FALSE)

dat |>
  tibble::rowid_to_column(var = "match") |> 
  rename(
    home_player_average1 = home_player_average,
    away_player_average1 = away_player_average) |> 
  rename_with(
    ~ gsub("^(.*?)_(l\\d+)_(.*)$", "\\2_\\1_\\3", .x),
    matches("^.*_l\\d")
  ) |>
  pivot_longer(matches("^l\\d"),
    names_to = c("leg", ".value"),
    names_pattern = "^(\\d+)_(.*)$",
    names_prefix = "l"
  ) |> 
  # Final cleaning and renaming
  select(match, leg, everything()) |> 
  rename_with(
    ~ gsub("^home", "p1", .x), starts_with("home")  
  ) |> 
  rename_with(
    ~ gsub("^away", "p2", .x), starts_with("away")  
  ) |> 
  filter(!is.na(gap))
#> # A tibble: 49 × 19
#>    match leg   p1_team     p1_player         p1_score p2_score p2_team p2_player
#>    <int> <chr> <chr>       <chr>                <dbl>    <dbl> <chr>   <chr>    
#>  1     1 1     Art of Dart "Saygın \"Revolv…        2        3 EYT     "Şenol D…
#>  2     1 2     Art of Dart "Saygın \"Revolv…        2        3 EYT     "Şenol D…
#>  3     1 3     Art of Dart "Saygın \"Revolv…        2        3 EYT     "Şenol D…
#>  4     1 4     Art of Dart "Saygın \"Revolv…        2        3 EYT     "Şenol D…
#>  5     1 5     Art of Dart "Saygın \"Revolv…        2        3 EYT     "Şenol D…
#>  6     2 1     Art of Dart "Alpcan Mercan"          0        3 EYT     "Yavuz \…
#>  7     2 2     Art of Dart "Alpcan Mercan"          0        3 EYT     "Yavuz \…
#>  8     2 3     Art of Dart "Alpcan Mercan"          0        3 EYT     "Yavuz \…
#>  9     3 1     Art of Dart "Sedat \"Y.E.S. …        1        3 EYT     "Erdem \…
#> 10     3 2     Art of Dart "Sedat \"Y.E.S. …        1        3 EYT     "Erdem \…
#> # ℹ 39 more rows
#> # ℹ 11 more variables: p1_player_average1 <dbl>, p2_player_average1 <dbl>,
#> #   p1_win <dbl>, p2_win <dbl>, p1_player_darts <dbl>,
#> #   p1_player_remaining <dbl>, p2_player_darts <dbl>,
#> #   p2_player_remaining <dbl>, p1_player_average <dbl>,
#> #   p2_player_average <dbl>, gap <dbl>
© www.soinside.com 2019 - 2024. All rights reserved.