首页 > 解决方案 > 你将如何在 R 中循环这个?

问题描述

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

所以,假设我有这个小标题:

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

我的目标是创建三个新列(对于我拥有的每个唯一“玩家”),如果玩家是“玩家 1”,则为该列分配值 1,如果玩家是“玩家 2”,则为 -1,否则为 0。

以前,我一直在这样做:

dat %>% mutate( aa = ifelse(player1 == "aa",1,ifelse(player2 == "aa",-1,0)),
          bb = ifelse(player1 == "bb",1,ifelse(player2 == "bb",-1,0)),
          cc = ifelse(player1 == "cc",1,ifelse(player2 == "cc",-1,0)))

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

标签: r

解决方案


model.matrix()从基础 R使用:

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

这假设您在两列中都有所有玩家。否则,您需要将它们转换为具有适当级别的因子并替换uniquelevels.


推荐阅读