我有一个运动队的数据,用于跟踪与其他球队的胜负情况,其结构如下:
Game TotalWins TotalLosses Team1Win Team1Loss Team2Win Team2Loss ...
1 1 0 1 NA NA NA
2 1 1 NA NA NA 1
3 2 1 NA NA 1 NA
4 2 2 NA 1 NA NA
5 3 2 NA NA 1 NA
...
我想创建一个因子变量,其中包含比赛对阵的球队,以便数据如下所示:
Game TotalWins TotalLosses Team1Win Team1Loss Team2Win Team2Loss Team
1 1 0 1 NA NA NA Team1
2 1 1 NA NA NA 1 Team2
3 2 1 NA NA 1 NA Team2
4 2 2 NA 1 NA NA Team1
5 3 2 NA NA 1 NA Team2
...
我的想法(不是可行的代码)本质上是这样的:
if (Team1Win == 1 | Team1Loss == 1), Team = "Team1"
if (Team2Win == 1 | Team2Loss == 1), Team = "Team2"
我真的很纠结如何使用 mutate 在 dplyr 中做到这一点。我尝试过使用 ifelse、重新编码等各种方法,但我要么不断收到错误,要么得到不是我想要的结果。
在 dplyr 中进行这项工作的正确且最有效的方法是什么?
最佳答案
与其他答案类似,但进行了一些有用的更改:
na.rm = TRUE
在聚集
sub
工作得很好,不需要stringr
- 使用
full_join
根据目标包含完整数据。
library(dplyr)
library(tidyr)
df = read.delim(text =
"Game TotalWins TotalLosses Team1Win Team1Loss Team2Win Team2Loss
1 1 0 1 NA NA NA
2 1 1 NA NA NA 1
3 2 1 NA NA 1 NA
4 2 2 NA 1 NA NA
5 3 2 NA NA 1 NA", sep = " ")
df %>%
select(-starts_with("Total")) %>%
gather(Team, one, -Game, na.rm = TRUE) %>%
select(-one) %>%
mutate(Team = sub("Win|Loss", "", Team)) %>%
full_join(df, .)
#> Joining, by = "Game"
#> Game TotalWins TotalLosses Team1Win Team1Loss Team2Win Team2Loss Team
#> 1 1 1 0 1 NA NA NA Team1
#> 2 2 1 1 NA NA NA 1 Team2
#> 3 3 2 1 NA NA 1 NA Team2
#> 4 4 2 2 NA 1 NA NA Team1
#> 5 5 3 2 NA NA 1 NA Team2
关于r - 使用 dplyr 以数值变量为条件改变因子变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42010740/