Почему% in% в R не соответствует должным образом? - PullRequest
0 голосов
/ 23 мая 2018

Я новичок в R. Я создал два вектора 'a' и 'b' в R. Оба они содержат одинаковые элементы, но в разном порядке.Ниже приведены подробные сведения о двух векторах.

> str(a)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   369 obs. of  1 variable:
$ SKD_DOCUMENT_NO: chr  "A0000514011" "A0000514012" "A0000514013" "A0000514014" ...
> str(b)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   369 obs. of  1 variable:
$ SKD_DOCUMENT_NO: chr  "A0000648001" "A0000648050" "A0000648049" 
"A0000648048" ...

, но когда я пытаюсь проверить, находится ли элемент в векторах или нет, я получаю запутанные ответы от R.

>'A0000648050' %in% a   #[1] FALSE 
>"A0000648050" %in% a   #[1] FALSE

Нокогда я пытаюсь использовать другие методы, чтобы проверить, находится ли элемент в «а».Затем приходят следующие результаты:

> any(a == "A0000648050")       #[1] TRUE
> which(a == "A0000648050")     #[1] 115
> grep("A0000648050", a)        #[1] 1

Q1.Чего я не понимаю, так это почему% in% терпит неудачу.Как проще всего найти, если все элементы вектора «a» присутствуют во всех элементах вектора «b»?(все элементы «a» действительно присутствуют в «b». Но хотелось бы получить подтверждение из R).Почему следующие 2 строки дают разные результаты?

> a %in% b            #[1] FALSE
> setequal(a,b)       # TRUE

1 Ответ

0 голосов
/ 23 мая 2018

% в%

С ?'%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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...