你如何在R中循环这个?

你如何在R中循环这个?,r,R,我有一个简单的任务,我很难循环 那么,假设我有一个tibble: library(tidyverse) dat <- tibble(player1 = c("aa","bb","cc"), player2 = c("cc","aa","bb")) 这是可行的,但现在我有数百个不同的“玩家”,所以像那样手动操作似乎很愚蠢。我已经尝试并阅读了R中的循环,但我就是不能正确地理

我有一个简单的任务,我很难循环

那么,假设我有一个tibble:

library(tidyverse)
dat <- tibble(player1 = c("aa","bb","cc"), player2 = c("cc","aa","bb"))

这是可行的,但现在我有数百个不同的“玩家”,所以像那样手动操作似乎很愚蠢。我已经尝试并阅读了R中的循环,但我就是不能正确地理解这个循环。

我们可以从初始结构转换为“长”(-er)格式,每个(游戏,玩家)一行,重新编码为1/-1,然后使用所需的输出再次变宽:

dat %>% 
  mutate(game_id = row_number()) %>% 
  gather("role", "player", -game_id) %>% 
  mutate(role = recode(role, "player1" = 1L, "player2" = -1L)) %>% 
  spread(player, role, fill = 0L)

#> # A tibble: 3 x 4
#>   game_id    aa    bb    cc
#>     <int> <int> <int> <int>
#> 1       1     1     0    -1
#> 2       2    -1     1     0
#> 3       3     0    -1     1
dat%>%
变异(游戏id=行号())%>%
聚集(“角色”、“玩家”、-游戏id)%>%
突变(角色=重新编码(角色,“玩家1”=1L,“玩家2”=-1L))%>%
排列(玩家、角色、填充=0升)
#>#tibble:3 x 4
#>游戏id aa bb cc
#>        
#> 1       1     1     0    -1
#> 2       2    -1     1     0
#> 3       3     0    -1     1
使用基本R中的
model.matrix()

dat[unique(dat$player1)] <- 
  model.matrix(~0+ player1, data = dat) - model.matrix(~0+ player2, data = dat)

dat
  player1 player2    aa    bb    cc
  <chr>   <chr>   <dbl> <dbl> <dbl>
1 aa      cc          1     0    -1
2 bb      aa         -1     1     0
3 cc      bb          0    -1     1

dat[unique(dat$player1)]您可以使用
pivot_longer()
堆叠以“player”开头的列,然后将其旋转到广角。优点是您可以通过参数
values\u fn
pivot\u wide()
中进行重新编码

library(tidyverse)

dat %>%
  rowid_to_column("id") %>%
  pivot_longer(starts_with("player")) %>%
  pivot_wider(names_from = value, names_sort = TRUE,
              values_from = name, values_fill = 0,
              values_fn = function(x) c(1, -1)[match(x, c("player1", "player2"))])

# # A tibble: 3 x 4
#      id    aa    bb    cc
#   <int> <dbl> <dbl> <dbl>
# 1     1     1     0    -1
# 2     2    -1     1     0
# 3     3     0    -1     1
库(tidyverse)
dat%>%
行id到列(“id”)%>%
轴心旋转时间更长(从(“玩家”)开始)%>%
pivot\u更宽(names\u from=value,names\u sort=TRUE,
值\u from=name,值\u fill=0,
值=函数(x)c(1,-1)[匹配(x,c(“player1”,“player2”))]
##tibble:3 x 4
#id aa bb cc
#      
# 1     1     1     0    -1
# 2     2    -1     1     0
# 3     3     0    -1     1

注意:
gather()
/
spread()
上的开发已经完成,对于新代码,我们建议切换到
pivot\u longer()
/
\u wide()
,这更易于使用,更具特色,并且仍在积极开发中。

我不太明白,你怎么会有“数百个不同的玩家”但仍然只有3个选项(1;0和-1)。你的意思是让“player1”和“player2”的名字更通用吗?我想说开发完成是件好事。如果pivot_*仍在开发中,那么相同的开发可能会破坏现有代码。几年前,gather()/spread()就是这样。
library(tidyverse)

dat %>%
  rowid_to_column("id") %>%
  pivot_longer(starts_with("player")) %>%
  pivot_wider(names_from = value, names_sort = TRUE,
              values_from = name, values_fill = 0,
              values_fn = function(x) c(1, -1)[match(x, c("player1", "player2"))])

# # A tibble: 3 x 4
#      id    aa    bb    cc
#   <int> <dbl> <dbl> <dbl>
# 1     1     1     0    -1
# 2     2    -1     1     0
# 3     3     0    -1     1