如果条件---缺少需要TRUE / FALSE的值

时间:2019-10-12 16:30:15

标签: r if-statement

我试图运行“ if”和“ else if”条件,以基于两个现有变量的值创建一个新变量。这是我正在写条件的两个现有变量的示例输出。

这里是复制两个变量的输出:

structure(list(C = c(NA, NA, "Standard", "Standard", NA, "Micro", 
NA, NA, NA, NA, "Nursery", "Standard", NA, "Micro", "Micro", 
NA, NA, NA, "Standard", "Standard"), P = c(NA, NA, "Standard", 
"Standard", NA, NA, NA, NA, NA, NA, NA, "Standard", "Standard", 
"Micro", NA, NA, NA, NA, NA, "Standard")), row.names = c(NA, 
-20L), class = c("tbl_df", "tbl", "data.frame"))

这是我正在使用的if和else if语句:

if (DF$C=="Standard" | DF$P=="Standard") {
  mutate("Type" = "Standard")
} else if (DF$C=="Micro" | DF$P=="Micro") {
  mutate("Type" = "Micro")
} else if (DF$C=="Nursery" | DF$P=="Nursery") {
  mutate("Type" = "Nursery")
  } else {
    mutate("Type" = "Other")
  }

我想要的是一个名为“ Type”的新变量,其值为“ Standard”,“ Micro”,“ Nursery”或“ Other”,但我却收到了此错误消息:

Error in if (Site.Details.TEST$C == "Standard" | Site.Details.TEST$P ==  : 
  missing value where TRUE/FALSE needed
In addition: Warning message:
In if (Site.Details.TEST$C == "Standard" | Site.Details.TEST$P ==  :
  the condition has length > 1 and only the first element will be used

3 个答案:

答案 0 :(得分:0)

也许在dplyr中像这样进行矢量化处理的东西可以解决问题。基本上,您希望查看CP字段中是否满足三个匹配项(“标准”,“微型”或“苗圃”)之一。如果满足,则采用该匹配值。如果两列都不匹配,则编码为“其他”。

假设CP不能是不同的东西,这可以工作。如果是,则优先考虑C

library(dplyr)

check_types <- c("Standard", "Micro", "Nursery")

DF %>%
  mutate(Type = if_else(C %in% check_types | P %in% check_types, if_else(is.na(C), P, C), "Other"))

   C        P        Type    
   <chr>    <chr>    <chr>   
 1 NA       NA       Other   
 2 NA       NA       Other   
 3 Standard Standard Standard
 4 Standard Standard Standard
 5 NA       NA       Other 

if_else(condition, true, false)语句查找矢量化条件,然后查找truefalse的单个值,或与条件相同长度的矢量化值。在这种情况下:

条件:

C %in% check_types | P %in% check_types

这是一个向量,长度等于数据帧中的行数。向量中的每个位置都基于dplyr在相应行上的评估。

如果TRUEC中的选项之一,或者check_typesP中的选项之一,则值为check_types。否则将为FALSE

true:

if_else(is.na(C), P, C)

如果该语句的计算结果为TRUE,则现在检查以获取哪个值。如果(再次在给定的矢量点或行处)CNA,则取P。否则,请使用C

否:

"Other"

如果该语句的计算结果为FALSE,则将值设为“其他”。

答案 1 :(得分:0)

这与以前的答案几乎相同:

<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
    <link rel="stylesheet" href="Jeu.css">
  </head>
  <body>

    <canvas id="canvas" width="400" height="400"
    style="border-color: 'black'; border-width: 3px; border-style: solid">
      </canvas>
<br>
  <button type="button"onclick="dessiner()"><img src="Start.jpg"></button>

<script type="text/javascript">


  var canvas = document.getElementById("canvas");

  var contexte = canvas.getContext("2d");

  var x

  var y

function ghost(){

ghost= new Image();
ghost.src = "ghost.jpg";
ghost.onload = function(){
contexte.drawImage(ghost,x,y,20,20)

}};

x = 32 +(Math.random() * (400-64));
y = 32 +(Math.random() * (400-64));

function dessiner(){

  ghost()
};




  </script>
  </body>
</html>

答案 2 :(得分:0)

这可以在标准R中使用ifelse来完成,因为您实际上只想在P和C字段都匹配且不是NA时填充Type字段。

DF$Type <- ifelse( (is.na(DF$P) | is.na(DF$C)) | (DF$P != DF$C), 'Other', DF$C)