了解 if_else 语句的语法差异

fis*_*mno 0 if-statement r dplyr

我对 if_else 语句很陌生,我想知道是否有人可以帮助我理解我同事的一些代码的含义(他们不再在我所在的地方工作)。我使用 if_else 语句来识别/标记来自一组记录器部署的温度数据(即,我不希望在检索数据后或在检索和下一次部署之间记录数据等)。有些已部署和检索一次(在我的示例中为 B),有些已部署两次(在我的示例中为 A 和 C)。

以下是对数据集 (df) 的总体了解:

温度 日期时间日志 部署_1 部署_2 检索_1 检索_2 记录器
3.7 约会时间 约会时间 约会时间 约会时间 约会时间 A
3.6 约会时间 约会时间 约会时间 约会时间 约会时间 A
3.4 约会时间 约会时间 约会时间 约会时间 约会时间 A
3.1 约会时间 约会时间 约会时间
1.5 约会时间 约会时间 约会时间
1.5 约会时间 约会时间 约会时间 约会时间 约会时间 C

我正在研究另一位同事的一些旧代码,并且想知道这两个语句“说”了什么,或者它们的含义是什么。

  1. df$flag1 <- if_else(is.na(df$deploy_2),0,if_else(df$Datetime_log>retrieve_1 & df$Datetime_log<deploy_2,1,0))

    我假设上面的意思是:如果deploy_2是NA,则将其分配为0,但如果不是,并且Datetime_log>retrieve_1&<deploy_2,则将其分配为1。

  2. df$flag2 <- if_else(is.na(df$deploy_2), if_else(df$Datetime_log>df$retrieve_1, 1,0),0)

    我假设上面的意思是:如果deploy_2是NA,则将其分配为0,但如果不是,并且Datetime_log>retrieve_1,则将其分配为1?

我对“0”的位置也很困惑。与第一个语句中一样,0 被放置在第一个 if_else 之后,而在第二个语句中,0 被放置在整个语句的末尾。

请,如果有人可以纠正我或帮助我,我将非常感激!只是寻找有人非常清楚地阐明如何阅读这些陈述。这将帮助我制作额外的过滤器。提前非常感谢!

Gre*_*gor 5

你对#1 的解释是正确的,但#2 是不正确的。一般if_else工作为if_else(condition, result if true, result if false). 在您的代码中,多个if_else语句嵌套在另一个语句中,因此在这些情况下,其中一个结果是另一个if_else语句(将针对其自己的结果进行评估)。

在 #2 中发生的是If deploy_2is NA, then {(nested) if Datetime_log > retrieve_1allocate 1, else allocate 0} else allocate 0。总结一下一些更好的代码格式、命名参数以及发生的情况的表格:

## #2 from the question
if_else(
  condition = is.na(df$deploy_2),
  true = if_else(
      condition = df$Datetime_log > df$retrieve_1,
      true = 1,
      false = 0),
  false = 0
)

is.na(deploy_2) | Datetime_log > retrieve_1 | What to assign
----------------|---------------------------|---------------
TRUE            | TRUE                      | 1
TRUE            | FALSE                     | 0 
FALSE           | not checked               | 0

Run Code Online (Sandbox Code Playgroud)

你的#1 确实是正确的,但要以我们可以写的相同方式呈现它:

df$flag1 <- if_else(
    condition = is.na(df$deploy_2),
    true = 0,
    false = if_else(
        condition = df$Datetime_log > retrieve_1 & df$Datetime_log < deploy_2,
        true = 1,
        false = 0
    )
)

                | Datetime_log > retrieve_1     |
is.na(deploy_2) |  AND Datetime_log < deploy_2  | What to assign
----------------|-------------------------------|----------------
TRUE            | not checked                   | 0
FALSE           | TRUE                          | 1
FALSE           | FALSE                         | 0
Run Code Online (Sandbox Code Playgroud)

正如注释中所指出的,您的代码主要用于df$指定它正在使用数据框中的列 * df。然而,#1不使用df$forretrieve_1deploy_2这看起来很危险 - 它不是在数据框中查找这些名称的列,而是在全局环境中查找该名称的对象。

(另请注意,如果这些代码出现在类似或之类dplyr的函数内部,则不需要前缀。但是,正如所写,可能需要前缀。)mutatesummarizedf$df$