首页 > 解决方案 > 具有不同选择的 R IF 语句

问题描述

再见,

我已经收集了很多反馈来创建一个可重复的示例和我的编码尝试。

这是一个示例数据框:

df <- data.frame("STUDENT" = 1:10, 
                 "test_FALL" = c(0, 0, 0, 0, 1, 1, 1, 0, 0, NA), 
                 "test_SPRING" = c(1, 1, 1, 1, 0, 0, 0, 1, 1, 1), 
                 "score_FALL" = c(53, 52, 98, 54, 57 ,87, 62, 95, 75, NA), 
                 "score_SPRING" = c(75, 54, 57, 51, 51, 81, 77, 87, 73, 69), 
                 "final_SCORE" = c(75, 54, 57, 51, 57, 87, 62, 87, 73, 69))

和示例代码:

df$final_score[df$test_SPRING  == 1] <- df$score_SPRING
df$final_score[df$test_FALL == 1] <- df$score_FALL

第二次尝试代码:

df$final_score1[(df$test_SPRING  == 1 & !is.na(df$test_SPRING))] <- df$score_SPRING
df$final_score1[(df$test_FALL == 1 & !is.na(df$test_FALL))] <- df$score_FALL

在我的数据框中,我有一个学生参加考试(test_SPRING test_FALL)和考试成绩(score_SPRING score_FALL)。基本上我想创建包含在数据帧中的 final_SCORE 列,如果 test_SPRING = 1,tot_score = score_SPRING,否则如果 test_FALL = 1,tot_score = score_Fall。我无法这样做,并且在几个小时后无法弄清楚。请提供您可能有的任何建议。

标签: rif-statementlogic

解决方案


有几种方法可以创建“final_score”。

1)使用ifelse- 基于示例,“测试”列是互斥的。ifelse因此,我们可以通过检查基于'test_SPRING'(test_SPRING == 1)的条件来使用单个。如果为 TRUE,则获取“score_SPRING”,否则获取“score_FALSE”

with(df, ifelse(test_SPRING == 1, score_SPRING, score_FALL))
#[1] 75 54 57 51 57 87 62 87 73 69

2)算术 - 数字乘以 1 是数字本身,0 给出 0,因此将“分数”列与相应的“测试”列相乘,cbind并使用rowSums

with(df,  NA^(!test_FALL & !test_SPRING) * rowSums(cbind(
                       score_SPRING * test_SPRING,  
                       score_FALL * test_FALL), 
                    na.rm = TRUE))
#[1] 75 54 57 51 57 87 62 87 73 69

推荐阅读