【问题标题】:R IF statement with different selection具有不同选择的 R IF 语句
【发布时间】:2018-08-12 14:19:55
【问题描述】:

喏,

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

这是一个示例数据框:

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。我无法这样做,并且在几个小时后无法弄清楚。请提供您可能有的任何建议。

【问题讨论】:

  • 不清楚需要创建tot_score还是final_score需要with(df, ifelse(test_SPRING == 1, score_SPRING, score_FALL))
  • df %>% mutate(tot_score = ifelse(test_SPRING, score_SPRING,score_FALL))
  • 或使用with(df, rowSums(cbind(score_SPRING * test_SPRING, score_FALL * test_FALL), na.rm = TRUE))
  • 我已经编辑了这个问题,希望能澄清它。我在数据集中包含了 final_SCORE。那是我试图使用 final_score 和 final_score1 创建的变量

标签: r if-statement logic


【解决方案1】:

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

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

【讨论】:

  • 当我执行 na.rm=TRUE 时,当我在两列中都缺少值时,它会给我“0”。如何设置它,以便我得到与 na.rm=TRUE 相同的结果,但我生成 NA 而不是 '0' 两个缺失
  • @bvowe 更新了帖子
  • 这真的很好,谢谢。我现在想知道为什么我尝试的 if 语句不起作用?
  • @bvowe if/else 未矢量化,即它仅适用于单个元素,否则您需要循环(使用for 或lapply)与矢量化@987654331 相比,这在性能方面效率低下@
  • 所以我可以这样做:df$final_score
猜你喜欢
  • 2020-11-09
  • 2018-07-24
  • 1970-01-01
  • 2014-11-04
  • 1970-01-01
  • 2012-06-28
  • 2012-08-21
  • 1970-01-01
  • 2013-03-14
相关资源
最近更新 更多