首页 > 解决方案 > R:如何为我的数据集创建特定的循环和 ifelse 语句。(附数据集)

问题描述

我是 R 新手,我想就可以帮助我执行复杂任务的代码类型征求您的意见。我有一组包含通过或失败值的变量。基于这些值,测试函数应该完成下面编写的任务:

  1. 检查是否正常 == 失败,如果为真,则创建一个名为 test 的新列,将“失败”插入该特定情况的列中。

  2. 如果正常 == 失败,则为假,检查从 PD 到 SA == 失败。如果为真,则将“失败”插入在步骤 1 中创建的名为 test 的列中。

  3. 如果 PD to SA == Fail 为假,则将“通过”插入在步骤 1 中创建的名为 test 的列中。

  4. 应跳过特定情况下的任何 NA。

理想情况下,最后的表格应如下所示: 示例 1

从示例 1 可以看出,即使 normal == pass,因为 TH == Fail,测试列的最终结果是“失败”。

示例 2中,从正常到 SA 的所有值 == 通过,测试列的最终结果 ==“通过”。

最后在示例 3中,因为 normal == "Fail",测试列的最终结果 == "Fail"。

我一直在尝试创建这个函数并遍历我数据集中的 2000 个案例。但没有一个奏效。任何帮助将不胜感激。我已将链接附加到问题中的数据集以供参考。 https://drive.google.com/file/d/1nd0c99kuMiUdjhiKxNHK-j5TY9de9vbX/view?usp=sharing

标签: rloopsif-statement

解决方案


使用 dplyr 和case_when

library(dplyr)

data %>%
  mutate(Test=case_when(
    Normal=="Fail" ~ "Fail", 
    Normal!="Fail" & rowSums(select(., PD:SA) == "Fail", na.rm=TRUE) > 0 ~ "Fail",
    Normal=="Pass" ~ "Pass"))

# A tibble: 2,490 x 9
   Normal PD    MP    TH    Py    KA    VT    SA    Test 
   <chr>  <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
 1 Pass   Pass  Pass  Fail  Pass  Pass  Pass  Pass  Fail 
 2 Pass   Pass  Fail  Pass  Pass  Pass  Pass  Pass  Fail 
 3 Fail   Pass  Pass  Pass  Pass  Pass  Pass  Fail  Fail 
 4 Pass   Fail  Pass  Pass  Pass  Pass  Pass  Pass  Fail 
 5 Fail   Pass  Fail  Pass  Pass  Pass  Fail  Pass  Fail 
 6 Pass   Pass  Fail  Fail  Pass  Pass  Fail  Pass  Fail 
 7 Pass   Pass  Fail  Pass  Pass  Pass  Pass  Pass  Fail 
 8 Fail   Pass  Fail  Pass  Pass  Pass  Pass  Pass  Fail 
 9 Pass   Fail  Fail  Pass  Pass  Pass  Fail  Pass  Fail 
10 Pass   Pass  Pass  Fail  Pass  Pass  Fail  Pass  Fail 
# ... with 2,480 more rows

我必须找到一些通行证:

%>%
  filter(Test=="Pass")
# A tibble: 257 x 9
   Normal PD    MP    TH    Py    KA    VT    SA    Test 
   <chr>  <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
 1 Pass   Pass  Pass  Pass  Pass  Pass  Pass  Pass  Pass 
 2 Pass   Pass  Pass  Pass  Pass  Pass  Pass  Pass  Pass 
 3 Pass   Pass  Pass  Pass  Pass  Pass  Pass  Pass  Pass 
 4 Pass   Pass  Pass  Pass  Pass  Pass  Pass  Pass  Pass 
 5 Pass   Pass  Pass  Pass  Pass  Pass  Pass  Pass  Pass 

还有一些<NA>。这个脱颖而出(#541):

  %>% slice(541)
# A tibble: 1 x 9
  Normal PD    MP    TH    Py    KA    VT    SA    Test 
  <chr>  <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 Pass   Pass  Fail  Fail  NA    Pass  Fail  Pass  Fail 

最后的表格给出:

%>% count(Test)
# A tibble: 3 x 2
# Groups:   Test [3]
  Test      n
  <chr> <int>
1 Fail   2144
2 Pass    256
3 NA       90

资料

dput(head(data, 100))

data <- structure(list(Normal = c("Pass", "Pass", "Fail", "Pass", "Fail", 
"Pass", "Pass", "Fail", "Pass", "Pass", "Fail", "Fail", "Pass", 
"Pass", "Fail", "Fail", "Pass", "Pass", "Fail", "Pass", "Fail", 
"Pass", "Pass", "Fail", "Fail", "Fail", "Fail", "Pass", "Fail", 
"Fail", "Pass", "Pass", "Fail", "Pass", "Pass", "Pass", "Fail", 
"Pass", "Pass", "Pass", "Fail", "Pass", "Pass", "Pass", "Pass", 
"Fail", "Pass", "Fail", "Pass", "Pass", "Pass", "Fail", "Pass", 
"Pass", "Pass", "Fail", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass", "Fail", "Fail", "Fail", "Fail", "Fail", "Fail", 
"Fail", "Fail", "Pass", "Fail", "Pass", "Fail", "Pass", "Pass", 
"Fail", "Fail", "Pass", "Pass", "Fail", "Pass", "Fail", "Fail", 
"Pass", "Pass", "Fail", NA, "Pass", "Fail", "Pass", "Fail", "Fail", 
"Pass", "Pass", "Fail", "Fail", "Fail", "Pass"), PD = c("Pass", 
"Pass", "Pass", "Fail", "Pass", "Pass", "Pass", "Pass", "Fail", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Fail", "Pass", "Pass", 
"Pass", "Fail", "Pass", "Pass", "Pass", "Fail", "Pass", "Fail", 
"Fail", "Fail", "Fail", "Pass", "Pass", "Fail", "Pass", "Fail", 
"Pass", "Fail", "Pass", "Pass", "Fail", "Pass", "Pass", "Fail", 
"Pass", "Fail", "Fail", "Fail", "Pass", "Fail", "Fail", "Pass", 
"Fail", "Pass", "Fail", "Fail", "Pass", "Pass", "Pass", "Fail", 
"Fail", "Fail", "Fail", "Pass", "Pass", "Pass", "Fail", "Pass", 
"Fail", "Pass", "Fail", "Fail", "Pass", "Fail", "Pass", "Fail", 
"Pass", "Pass", "Pass", "Fail", "Fail", "Pass", "Pass", "Fail", 
"Pass", "Fail", "Fail", "Fail", "Fail", "Fail", "Pass", NA, "Pass", 
"Pass", "Fail", "Fail", "Fail", "Fail", "Fail", "Pass", "Fail", 
"Pass", "Fail"), MP = c("Pass", "Fail", "Pass", "Pass", "Fail", 
"Fail", "Fail", "Fail", "Fail", "Pass", "Fail", "Fail", "Fail", 
"Fail", "Pass", "Pass", "Pass", "Pass", "Pass", "Fail", "Fail", 
"Pass", "Pass", "Fail", "Pass", "Pass", "Pass", "Fail", "Pass", 
"Pass", "Fail", "Pass", "Pass", "Fail", "Fail", "Fail", "Pass", 
"Fail", "Pass", "Pass", "Pass", "Pass", "Fail", "Pass", "Fail", 
"Fail", "Fail", "Pass", "Fail", "Fail", "Fail", "Pass", "Fail", 
"Fail", "Fail", "Pass", "Fail", "Pass", "Fail", "Pass", "Pass", 
"Pass", "Pass", "Pass", "Fail", "Pass", "Fail", "Pass", "Pass", 
"Pass", "Pass", "Fail", "Fail", "Fail", "Fail", "Pass", "Fail", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Fail", "Fail", "Fail", NA, "Pass", "Pass", "Fail", "Pass", "Fail", 
"Pass", "Fail", "Pass", "Pass", "Fail", "Fail"), TH = c("Fail", 
"Pass", "Pass", "Pass", "Pass", "Fail", "Pass", "Pass", "Pass", 
"Fail", "Pass", "Fail", "Fail", "Pass", "Fail", "Pass", "Fail", 
"Pass", "Pass", "Pass", "Fail", "Fail", "Pass", "Pass", "Fail", 
"Fail", "Fail", "Pass", "Fail", "Pass", "Pass", "Fail", "Pass", 
"Fail", "Pass", "Pass", "Fail", "Fail", "Fail", "Pass", "Fail", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Fail", "Pass", 
"Fail", "Fail", "Pass", "Pass", "Pass", "Fail", "Pass", "Pass", 
"Fail", "Pass", "Pass", "Pass", "Fail", "Fail", "Pass", "Pass", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Fail", "Pass", "Pass", 
"Pass", "Pass", "Fail", "Pass", "Fail", "Fail", "Pass", "Pass", 
"Pass", "Pass", "Fail", "Fail", "Pass", "Pass", "Pass", NA, "Pass", 
"Pass", "Fail", "Pass", "Fail", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass"), Py = c("Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass", "Pass", NA, "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass"), KA = c("Pass", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Fail", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Fail", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", NA, "Pass", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass"), VT = c("Pass", "Pass", "Pass", "Pass", "Fail", 
"Fail", "Pass", "Pass", "Fail", "Fail", "Fail", "Fail", "Pass", 
"Fail", "Fail", "Pass", "Fail", "Pass", "Fail", "Pass", "Fail", 
"Fail", "Pass", "Fail", "Fail", "Fail", "Fail", "Pass", "Fail", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass", "Fail", "Fail", "Pass", "Pass", "Fail", "Pass", 
"Pass", "Pass", "Pass", "Pass", "Fail", "Pass", "Fail", "Fail", 
"Fail", "Pass", "Fail", "Pass", "Fail", "Fail", "Pass", "Pass", 
"Pass", "Fail", "Pass", "Pass", "Pass", "Pass", "Fail", "Fail", 
"Pass", "Fail", "Fail", "Fail", "Pass", "Fail", "Pass", "Fail", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Fail", "Fail", NA, "Pass", "Fail", "Pass", "Fail", "Fail", 
"Pass", "Pass", "Fail", "Fail", "Fail", "Fail"), SA = c("Pass", 
"Pass", "Fail", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass", "Pass", "Fail", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass", "Fail", "Pass", "Pass", "Fail", "Pass", "Pass", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", NA, "Pass", 
"Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", 
"Pass", "Pass")), row.names = c(NA, -100L), class = c("tbl_df", 
"tbl", "data.frame"))

推荐阅读