具有不同选择的R IF语句

具有不同选择的R IF语句,r,if-statement,logic,R,If Statement,Logic,再见 我收集了很多反馈,创建了一个可复制的示例和我的编码尝试 以下是一个示例数据框: 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(5

再见

我收集了很多反馈,创建了一个可复制的示例和我的编码尝试

以下是一个示例数据框:

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有两种方法可以创建“最终分数”

1)使用
ifelse
-根据示例,“测试”列是互斥的。因此,我们可以通过基于“test_SPRING”(test_SPRING==1
)检查条件来使用单个
ifelse
。如果是真的,则获取“score\u SPRING”或“score\u 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

目前尚不清楚您是否需要创建
tot_分数
final_分数
是否需要
使用(df,ifelse(test_SPRING==1,score_SPRING,score_FALL))
df%>%变异(tot_分数=ifelse(test_SPRING,score_SPRING,score_FALL))或使用
使用(df,行和(cbind(score_SPRING*test_SPRING,score_FALL*test_FALL*test_FALL)),na.rm=TRUE))
我编辑了这个问题,希望能澄清它。我在数据集中包括了最终的分数。这就是我试图使用final_score和final_score1创建的变量,当我执行na.rm=TRUE时,当我在两列中都缺少值时,它会给我“0”。我如何设置它,以使我得到与na.rm=TRUE相同的结果,而不是生成两个缺失的值的“0”NA@bvowe更新了帖子这真的很好谢谢你。我现在想知道为什么我尝试过的if语句不起作用?@bvowe
if/else
不是矢量化的,即它只对单个元素起作用,或者你需要循环(使用
for
lappy
),与矢量化的
ifelse
相比,这在性能上是低效的,所以我可以做一些类似的事情:df$final\u score
with(df, ifelse(test_SPRING == 1, score_SPRING, score_FALL))
#[1] 75 54 57 51 57 87 62 87 73 69
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