% в%
С ?'%in%'
:
% в% в настоящее время определяется как «% в%» <- функция (x,table) match (x, table, nomatch = 0)> 0
Факторы, необработанные векторы и списки преобразуются в символьные векторы, а затем x и таблица приводятся к общему типу (последний из двух типовв порядке R, логическое <целое <числовое <сложное <символ) перед соответствием.Если несравненная длина имеет положительную длину, она приводится к общему типу. </p>
в вашем случае a
- это tibble
, то есть data.frame
, то есть list
, поэтомупреобразуется в символ перед сравнением.
a <- tibble(SKD_DOCUMENT_NO =c("A0000514011","A0000514012","A0000514013","A0000514014"))
as.character(a)
# [1] "c(\"A0000514011\", \"A0000514012\", \"A0000514013\", \"A0000514014\")"
Это, хотя и не интуитивно, вернет TRUE
:
"c(\"A0000514011\", \"A0000514012\", \"A0000514013\", \"A0000514014\")" %in% a
any
из ?any
, для аргумента ...
:
Другие объекты нулевой длины игнорируются, а остальные принудительно логически игнорируются любым классом.
a == "A0000514012"
# SKD_DOCUMENT_NO
# [1,] FALSE
# [2,] TRUE
# [3,] FALSE
# [4,] FALSE
Следующее происходит, когда мы приводим его к логическому:
as.logical(a == "A0000514012")
# [1] FALSE TRUE FALSE FALSE
, поэтому вывод, полученный с помощью any(a == "A0000514012")
, имеет смысл.
То же упражнение можно выполнить с помощью which
или grep
решение
Решение заключается в использовании:
"A0000514012" %in% a$SKD_DOCUMENT_NO # to look into a precise column
или
"A0000514012" %in% unlist(a) # to look into all columns, equivalent to your solution with `any`
или
sapply(a,`%in%`,x = "A0000514012") # to look into individual columns separately