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 |
我正在研究另一位同事的一些旧代码,并且想知道这两个语句“说”了什么,或者它们的含义是什么。
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。
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 被放置在整个语句的末尾。
请,如果有人可以纠正我或帮助我,我将非常感激!只是寻找有人非常清楚地阐明如何阅读这些陈述。这将帮助我制作额外的过滤器。提前非常感谢!
你对#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_1和deploy_2这看起来很危险 - 它不是在数据框中查找这些名称的列,而是在全局环境中查找该名称的对象。
(另请注意,如果这些代码出现在类似或之类dplyr的函数内部,则不需要前缀。但是,正如所写,可能需要前缀。)mutatesummarizedf$df$