r - найти строку в любых элементах списка, а затем использовать имя этого элемента списка - PullRequest
0 голосов
/ 08 февраля 2020

Я пытаюсь проверить, существует ли строка в каком-либо из элементов списка, а затем использовать имя этого списка, если оно существует.

Сейчас я использую case_when и * 1004. *, но я бы хотел более эффективный способ просмотреть мои named_list и затем использовать имя.


fruit <- c("apple", "banana", "pear")
drinks <- c("beer", "wine", "coffee")
stuff <- c("chair", "couch", "desk")


df <- data.frame(foo = sample(x = c(fruit, drinks, stuff), size = 10, replace = T),
                 x = sample(1:500, size = 10, replace = T))

df

# foo    x
# pear   449
# wine   241
# pear   53
# couch  72
# banana 443
# coffee 172
# desk   126
# desk   183
# desk   7
# banana 73

df %>%
  mutate(category = case_when(grepl(paste0(fruit, collapse = "|"), foo, ignore.case = T) ~ "fruit",
                              grepl(paste0(drinks, collapse = "|"), foo, ignore.case = T) ~ "drinks",
                              grepl(paste0(stuff, collapse = "|"), foo, ignore.case = T) ~ "stuff"))

# foo    x   category
# pear   449 fruit
# wine   241 drinks
# pear   53  fruit
# couch  172 stuff
# banana 443 fruit
# coffee 172 drinks
# desk   126 stuff
# desk   183 stuff
# desk   7   stuff
# banana 73  fruit

# create named list of lists/vectors
named_list <- Hmisc::llist(fruit, drinks, stuff)
named_list

Ответы [ 2 ]

1 голос
/ 08 февраля 2020

Вы можете сделать что-то вроде этого:

gsub("\\d", "", names(sort(unlist(lapply(named_list, lapply, function(x) grep(x, df$foo))))))
#> [1] "drinks" "stuff"  "fruit"  "drinks" "stuff"  "stuff"  "stuff"  "stuff"  "drinks"
#> [10] "fruit" 

Это работает, беря именованный список и исследуя каждый из его векторов (с ошибкой). Для каждого вектора он снова вызывает lapply для grep каждого члена вектора именованного списка против df $ foo.

Результатом является вложенный список, где каждый лист является вектором индексов совпадений с конкретным элементом. Когда вы удаляете этот вложенный список из списка, имена именованного списка связываются с каждым элементом. Их можно упорядочить по их индексам, а затем по именам. Вы должны удалить номера, которые добавляются к именам с помощью gsub.

0 голосов
/ 09 февраля 2020

Вот базовое решение R, использующее атрибут имени

tbl <- `names<-`(unlist(lst <- list(fruit = fruit, drinks = drinks, stuff = stuff)),
                 rep(names(lst),lengths(lst)))
df$category <- names(tbl)[match(df$foo,tbl)]

Пример

> df
      foo   x category
1    desk 277    stuff
2    beer 362   drinks
3   chair 438    stuff
4   apple 494    fruit
5  banana 330    fruit
6   chair 263    stuff
7  banana 329    fruit
8    pear  79    fruit
9   apple 213    fruit
10   wine  37   drinks
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...