Относится к стартам с несколькими шаблонами в R - PullRequest
3 голосов
/ 07 апреля 2020

Я заметил проблему или проблему с функцией startsWith(). Следующий код отображает два разных выбора. Первый ведет себя нормально, это кусок кода:

dt_test <- data.table(a = c("abcd", "poo", "abla", "ba"),
                      id = c(1,2,3, 4))

dt_test[startsWith(a, c("ab", "ao")),id]
# [1] 1 3

startsWith(dt_test$a, c("ab", "ao"))
# TRUE FALSE TRUE FALSE

И если вы заметили, этот выбирает только первый, который противоречит интуиции, поскольку id 2 и 4 должны быть TRUE

dt_test <- data.table(a = c("ab","abcd", "poo", "abla", "ba"),
                      id = c(1,2,3, 4,5))

dt_test[startsWith(a, c("ab", "ao")),id]
# [1] 1

startsWith(dt_test$a, c("ab", "ao"))
# [1]  TRUE FALSE FALSE FALSE FALSE

Что я должен использовать вместо startsWith() в этом конкретном случае?

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Нам нужно передать несколько startsWith

library(data.table)
dt_test[Reduce(`|`, lapply(c('ab', 'ao'), startsWith, x = a))]
#     a id
#1:   ab  1
#2: abcd  2
#3: abla  4

или просто использовать grepl

dt_test[grepl('^a[bo]', a)]
#      a id
#1:   ab  1
#2: abcd  2
#3: abla  4

Или с %like%

dt_test[a %like% '^a[bo]']
#      a id
#1:   ab  1
#2: abcd  2
#3: abla  4
0 голосов
/ 07 апреля 2020

На странице справки ?startsWith() указывается

префикс, суффикс: символьный вектор (часто длиной один).

В вашем случае вы передаете более один персонаж Следовательно, несколько шаблонов не допускаются в пределах startsWith.

Вы можете попробовать это:

dt_test[grepl('^ab|^ao', a)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...