Значения группы на основе вектора и столбца обновления - PullRequest
1 голос
/ 27 марта 2019

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

Пример данных

df <- data.frame(ID = 1:5, Type = c("Windows", "Windows Server", "Cat", "Dog", "Eggs"))

it <- c("Windows", "Windows Server")
animal <- c("Cat", "Dog")
food <- c("Eggs")

То, что я пытался, но не удалось

df$Grouping <- gsub(it, "IT", df$Type)

Ошибка: шаблон>1

Метод, который работает, но многословно

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

df %>% mutate(Grouping = ifelse(Type == "Windows", "IT", 
                                ifelse ...))

Предполагаемый вывод

ID           Type         Grouping
1  1        Windows          IT
2  2 Windows Server          IT
3  3            Cat        Animal
4  4            Dog        Animal
5  5           Eggs        Food

Спасибо!

Ответы [ 3 ]

1 голос
/ 27 марта 2019

Создайте список ваших предопределенных векторов, а затем проверьте, какой элемент списка содержит элементы внутри df$Type

mylist = mget(c("animal", "food", "it"))
names(mylist)[max.col(t(sapply(df$Type, function(x) lapply(mylist, function(y) x %in% y))))]
#[1] "it"     "it"     "animal" "animal" "food"
0 голосов
/ 27 марта 2019

вопрос в опубликованном виде не имеет большого смысла.В частности, с образцами данных не проще хранить векторы независимых типов, чем сохранять тип как атрибут начального фрейма данных.может быть, вы могли бы добавить цвет, который дает более подробную информацию о характере проблемы.

с учетом сказанного, предполагая, что ваша проблема заключается в том, что векторы поиска хранятся в другом источнике и должны загружаться независимо, простойпетли должно хватить.(Я использую data.table, потому что я даже не помню, как использовать raw data.frame):

df <- data.table(ID = 1:5, Type = c("Windows", "Windows Server", "Cat", "Dog", "Eggs"))
it <- c("Windows", "Windows Server")
animal <- c("Cat", "Dog")
food <- c("Eggs")

lookup.names <- c("it", "animal", "food")
for (z in 1:length(lookup.names) ) {
    lookup <- get(lookup.names[z]) #maybe need to do some more sophisticated load, like from a file or database
    df[Type %in% lookup, Grouping := lookup.names[z]]
}
0 голосов
/ 27 марта 2019

Один из вариантов - создать list (или data.frame) для сопоставлений, а затем выполнить left_join

map <- list(
    it = c("Windows", "Windows Server"),
    animal = c("Cat", "Dog"),
    food = c("Eggs"))

library(dplyr)   
df %>% left_join(stack(map), by = c("Type" = "values"))
#  ID           Type    ind
#1  1        Windows     it
#2  2 Windows Server     it
#3  3            Cat animal
#4  4            Dog animal
#5  5           Eggs   food
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...