尝试在R中的FOR循环内运行IF语句

时间:2019-11-21 11:08:34

标签: r

我试图在数据集中创建一个新列,并根据另一列中的值用文本填充该列。该数据不仅包含ST。还有其他职位,但这只是我正在测试的职位。

我一直在尝试通过在FOR循环中使用IF语句来实现此目的

当前数据(不仅只有一个人,这是我正在测试的玩家)

short_name    team_position    position_group
J. Obika          ST                NA
D. Payet          LW                NA
D. Luiz           CB                NA

下面是我希望数据显示的样子

short_name    team_position    position_group
J. Obika          ST              FORWARD
D. Payet          LW              FORWARD
D. Luiz           CB              DEFENDER

下面是我尝试的一些代码

for(i in 1:length(fifa20datasample$team_position)){
  if(fifa20datasample$team_position[i] == 'ST'){
    fifa20datasample$position_group[i] == "FORWARD"
  }
}
  

if(fifa20datasample $ team_position [i] ==“ ST”){时出错   需要TRUE / FALSE的值

for(i in 1:length(fifa20datasample$team_position)){
      if(fifa20datasample$team_position[i] == "ST"){
        fifa20datasample$position_group[i] == "FORWARD"
      }
}
  

if(fifa20datasample $ team_position [i] ==“ ST”){时出错   需要TRUE / FALSE的值

for(i in 1:length(fifa20datasample$team_position)){
  if(class(fifa20datasample$team_position[i]) == 'ST'){
    fifa20datasample$position_group[i] == "FORWARD"
  }
}
  

这不会执行任何操作,也不会显示错误

for(i in 1:length(fifa20datasample$team_position)){
  if(class(fifa20datasample$team_position[i]) == "ST"){
    fifa20datasample$position_group[i] == "FORWARD"
  }
}
  

这不会执行任何操作,也不会显示错误

编辑:对于上述每个选项,我还尝试了以下方法

for(i in 1:length(fifa20datasample$team_position)){  
     if(fifa20datasample$team_position[i] == 'ST'){
     fifa20datasample$position_group[i] <- "FORWARD"   
      } 
 }

1 个答案:

答案 0 :(得分:1)

在这种情况下,dplyr库中的

case_when确实很有帮助。它将您遇到的许多迭代问题抽象化。

您提供的样本只有一个球员和一个位置,我在示例中添加了更多选项,以便您可以真正轻松地覆盖所有其他位置。

case_when通过检查数据框并允许您针对某一列检查条件并根据该条件修改同一行中的列来进行工作。

https://dplyr.tidyverse.org/reference/case_when.html

library(tibble)
library(dplyr)

fifa20datasample <- tibble(
        short_name = 'J. Obika', 
        team_position = 'ST', 
        position_group = NA
)


fifa20datasample %>% 
        mutate(
                position_group = case_when(
                        team_position %in% c('ST', 'LW') ~  'FORWARD', 
                        team_position %in% c('CAM', 'CM') ~  'MIDFIELD', 
                        team_position %in% c('CB') ~  'DEFENDER', 
                        team_position %in% c('GK') ~  'GOALKEEPER'
                )
        )


  short_name team_position position_group
  <chr>      <chr>         <chr>         
1 J. Obika   ST            FORWARD