r - 你将如何在 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 中的循环,但我就是无法正确理解这一点。
解决方案
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
这假设您在两列中都有所有玩家。否则,您需要将它们转换为具有适当级别的因子并替换unique
为levels
.
推荐阅读
- authentication - 如何使用 path_provider 包在 Flutter 中构建登录页面以将登录信息存储在本地文件中
- reactjs - React Native App 尝试在 Picker 中使用 FlatList
- python - 在字典python中删除\ n
- ios - Swift:如何将结构转换为字典以及键的层次结构
- pyspark - 在 sagemaker sparkmagic pyspark notebook 中安装 python 包
- r - 用于比较 R 中不同数据帧中的行的非参数测试
- azure-load-balancer - Azure 负载均衡器:针对特定控制器的广播
- automation - 错误:第二个功能文件缺少步骤实现
- spring - 是否有一个框架可以按照 Spring Roo 对模型定义语言中定义的模型的正向工程所做的工作?
- vue.js - 使用 Apollo 和 Vue 路由器重命名页面