首页 > 解决方案 > 不明白为什么 if-else for 循环不起作用

问题描述

只是似乎无法找到这个调用出错的地方。我正在尝试创建一个新列来显示获得的幻想点数,而“好” field_goal_result 的 kick_distance 决定了这一点。

for (i in 1:nrow(kickers)) {
 if (kickers$field_goal_result[i] == "good" & kickers$kick_distance[i] < 40) {
   kickers$fantasy_points_added[i] <- 3 
 } else if (kickers$field_goal_result[i] == "good" & kickers$kick_distance[i] > 39 & kickers$kick_distance[i] < 50) {
     kickers$fantasy_points_added[i] <- 4
   } else if (kickers$field_goal_result[i] == "good" & kickers$kick_distance[i] > 49) {
     kickers$fantasy_points_added[i] <- 5
   } else {
   kickers$fantasy_points_added[i] <- NA
 }
}

Error in if (kickers$field_goal_result[i] == "good" & kickers$kick_distance[i] <  : 
  missing value where TRUE/FALSE needed

标签: rfor-loop

解决方案


一个更好的方法是使用嵌套ifelse代替:

kickers$fantasy_points_added <- ifelse(
  kickers$field_goal_result == "good" & kickers$kick_distance < 40, 
  3,
  ifelse(
    kickers$field_goal_result == "good" & kickers$kick_distance > 39 & kickers$kick_distance < 50,
    4,
    ifelse(
      kickers$field_goal_result == "good" & kickers$kick_distance > 49,
      5, 
      NA
    )
  )
)

或使用dplyr's case_when

kickers$fantasy_points_added <- dplyr::case_when(
  kickers$field_goal_result == "good" & kickers$kick_distance < 40 ~ 3,
  kickers$field_goal_result == "good" & kickers$kick_distance > 39 & kickers$kick_distance < 50 ~ 4,
  kickers$field_goal_result == "good" & kickers$kick_distance > 49 ~ 5,
  TRUE ~ NA
)

推荐阅读