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