将date与date_as_string进行比较时,%vs'=='的百分比

时间:2017-07-20 09:26:01

标签: r

我很困惑为什么%in%'=='会给出不同的结果:

day_string <- '2017-07-20'
day_date <- as.Date(day_string)

day_string == day_date #TRUE
day_string %in% day_date #FALSE

来自%in%帮助: %in%目前定义为"%in%" <- function(x, table) match(x, table, nomatch = 0) > 0

因此,如果我理解正确,因为match强制日期为字符(但首先是数字),

day_string %in% day_date 

被翻译为

match(day_string, as.character(as.numeric(day_date)), nomatch = 0) > 0

然而'=='帮助说它也强迫不同类型。 '=='在上面的例子中实际做了什么,为什么它的行为与%in%不同?

2 个答案:

答案 0 :(得分:3)

?==&#34; 的帮助下如果两个参数是不同类型的原子向量,则一个被强制为另一个的类型&#34; 所以我想虽然==有两个相同的类型向量要比较,但%in%正在尝试将日期与字符进行比较。

但是,这只发生在日期Vs字符,即

as.character(5) %in% 5
#[1] TRUE

as.factor('abc') %in% 'abc'
#[1] TRUE

5 %in% 5L
#[1] TRUE

对于OP,如@Cath所述,df_date首先转换为数字,然后转换为字符,因此最终比较是,

as.character(as.numeric(day_date))
#[1] "17367"

as.character(as.numeric(day_date)) %in% day_string
#[1] FALSE

仔细检查,

'17367' %in% as.Date(day_string)
#[1] TRUE

答案 1 :(得分:1)

关系运算符"=="是(如?"=="中所述)一个泛型函数,它具有/可以直接("==.class")或通过Ops通用定义的方法组(Ops.class)。这样的函数极有可能有方法来计算R的基类,例如&#34; Date&#34;类似于"=="?Ops.Date的情况,可以按预期工作。我们可以看看&#34;日期&#34; methods(class = "Date")的泛型函数支持class。

另一方面,match(及其包装"%in%")不是通用的,不一定能指望&#34;类&#34;其参数的属性(即使是R自己的类)。如果它所考虑的类是因为它明确地设计为考虑特定类,并且在相应的帮助页面中记录了这样的事实 。例如,{&#34; POSIXlt&#34; class(day_string %in% as.POSIXlt(day_date)按需工作)。因此,"%in%"忽略了&#34; day_date&#34;它所看到的只是它传递了typeof(day_date)unclass(day_date))和typeof(day_string),其中适当的强制措施(比如as.character.default(day_date))根据到?match