【问题标题】:Short-Circuiting in R element-wise & or | operatorsR element-wise & or 中的短路运营商
【发布时间】:2020-01-14 04:39:25
【问题描述】:

我正在尝试了解如何在 R 中实现短路。这是一个示例 data.frame:

 v <- data.frame(id=c(1,2,3,4), effective_from=c('', '1/1/2001', '10/1/2001', '1/1/2002'), effective_to=c('', '1/10/2001', '', '1/1/2001'))
  id effective_from effective_to
1  1                            
2  2       1/1/2001    1/10/2001
3  3      10/1/2001             
4  4       1/1/2002     1/1/2001

我认为下面的语句会起作用(假设effective_fromeffective_to 是可以包含日期或空白的字符串)。

str_length(v$effective_from) > 0 & str_length(v$effective_to) > 0 & as.Date(v$effective_from) > as.Date(v$effective_to)

但我收到一条错误消息:

Error in charToDate(x) : 
  character string is not in a standard unambiguous format

在运行上面的语句而不是错误之后,我期望得到:FALSE, FALSE, FALSE, TRUE

我会认为如果effective_fromeffective_to 的长度effective_from 是空白的,我上面的语句将在尝试评估str_length('effective_from') 时返回 FALSE,从而使进一步的评估短路。

不知道为什么它不起作用...我将如何实现短路元素 AND 或 OR?

【问题讨论】:

  • 可能是Date 格式不是正确的默认格式,即您可能需要format = yourformat(as.Date(v$effective_from) &gt; as.Date(v$effective_to))
  • 使用&amp;&amp;,而不是&amp; 进行短路评估。
  • R 对整个向量进行操作。您不能将某些元素短路,而不能将其他元素短路。
  • 创建索引并跳过这些元素可能会更好
  • 日期格式为 m/d/y

标签: r


【解决方案1】:

这是一个基本的 R 解决方案,其中使用了 nchar() + as.vector() + as.Date()

res <- with(v, nchar(as.vector(effective_from)) >0 
            & nchar(as.vector(effective_to))>0
            & as.Date(as.vector(effective_from), "%m/%d/%Y") > as.Date(as.vector(effective_to), "%m/%d/%Y"))

这样

> res
[1] FALSE FALSE FALSE  TRUE

【讨论】:

  • 啊,所以我缺少的只是format?哦,呵呵!
  • @Denis 我想是的。而且您的列也是因素,因此您需要将它们作为代码中的向量
  • str_length(x) as.character(x)
  • @Denis,太好了,那你就不需要as.vector()
猜你喜欢
  • 2013-08-23
  • 2016-06-25
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
  • 2017-03-03
  • 2017-02-12
  • 1970-01-01
  • 2017-02-20
相关资源
最近更新 更多