2015-12-12 2 views
0

Я пытаюсь отфильтровать только строки из таблицы, в которых есть слово «собака» в столбце заголовка, но я не могу заставить его работать.Функция фильтра dplyr в сочетании с agrep

Вот пример данных:

ID NozamaItemID             NozamaTitle 
1 4557 12000017544 Starbucks Double Shot Espresso Light (4 Count, 6.5 Fl Oz Each) 
2 4558 12000021992          Pepsi, 8Ct, 12Oz Bottle 
3 4559 12000024542      Zuke'S Natural Hip Action dog Treats, 3 Oz 
4 4560 12000030680     Pepsi Made With Real Sugar, 12 Ct, 12 Oz Cans 
5 4561 12000030680     Pepsi Made With Real Sugar, 12 Ct, 12 Oz Cans 
6 4562 12000030680     Pepsi Made With Real Sugar, 12 Ct, 12 Oz Cans 

Следующий код должен работать, но это не так:

amzp <- select(amz, ID, NozamaItemID, NozamaTitle, NozamaCustomerID) 

searchTerm="cat|dog" 
amzp.a <- mutate(amzp, animalFood = ifelse(grepl(searchTerm, amzp$NozamaTitle, ignore.case = TRUE) == TRUE, TRUE, FALSE)) 

я бы ожидал увидеть ИСТИНА для строки 3. Любая помощь приветствуется. Спасибо

+0

@DrikLX, пожалуйста, воздержитесь от добавления фрагментов кода, когда они не работают. – Jaap

+0

Кроме того: у вас гораздо больше шансов получить хороший ответ, когда вы включаете [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-воспроизводимый пример/5963610) – Jaap

+2

@jaap, я не согласен с вашим первым комментарием - если бы они не предоставили никакого кода, люди спросили бы их: «Что вы пробовали? ? и для них лучше учиться, если люди могут сказать им, почему их подход не удался. –

ответ

3

Вы близки, вам просто нужно избавиться от ifelse:

amzp.a <- mutate(amzp, animalFood = grepl(searchTerm, 
         NozamaTitle, ignore.case = TRUE)) 

, который дает:

> amzp.a 
    ID NozamaItemID              NozamaTitle animalFood 
1 4557 12000017544 Starbucks Double Shot Espresso Light (4 Count, 6.5 Fl Oz Each)  FALSE 
2 4558 12000021992           Pepsi, 8Ct, 12Oz Bottle  FALSE 
3 4559 12000024542      Zuke'S Natural Hip Action dog Treats, 3 Oz  TRUE 
4 4560 12000030680     Pepsi Made With Real Sugar, 12 Ct, 12 Oz Cans  FALSE 
5 4561 12000030680     Pepsi Made With Real Sugar, 12 Ct, 12 Oz Cans  FALSE 
6 4562 12000030680     Pepsi Made With Real Sugar, 12 Ct, 12 Oz Cans  FALSE 

Используются данные:

amzp <- structure(list(ID = 4557:4562, 
         NozamaItemID = c(12000017544, 12000021992, 12000024542, 12000030680, 12000030680, 12000030680), 
         NozamaTitle = structure(c(4L, 1L, 2L, 3L, 3L, 3L), .Label = c("Pepsi, 8Ct, 12Oz Bottle","Zuke'S Natural Hip Action dog Treats, 3 Oz","Pepsi Made With Real Sugar, 12 Ct, 12 Oz Cans","Starbucks Double Shot Espresso Light (4 Count, 6.5 Fl Oz Each)"), class = "factor")), 
        .Names = c("ID", "NozamaItemID", "NozamaTitle"), class = "data.frame", row.names = c(NA, -6L)) 

EDIT: Ваш исходный код:

amzp.a <- mutate(amzp, animalFood = ifelse(grepl(searchTerm, amzp$NozamaTitle, ignore.case = TRUE) == TRUE, TRUE, FALSE)) 

на самом деле работает. Хотя он содержит несколько компонентов, которые не нужны (в ifelse -statement и использование data$column внутри стандартной функции dplyr), это дает желаемый результат:

> amzp.a 
    ID NozamaItemID              NozamaTitle animalFood 
1 4557 12000017544 Starbucks Double Shot Espresso Light (4 Count, 6.5 Fl Oz Each)  FALSE 
2 4558 12000021992           Pepsi, 8Ct, 12Oz Bottle  FALSE 
3 4559 12000024542      Zuke'S Natural Hip Action dog Treats, 3 Oz  TRUE 
4 4560 12000030680     Pepsi Made With Real Sugar, 12 Ct, 12 Oz Cans  FALSE 
5 4561 12000030680     Pepsi Made With Real Sugar, 12 Ct, 12 Oz Cans  FALSE 
6 4562 12000030680     Pepsi Made With Real Sugar, 12 Ct, 12 Oz Cans  FALSE 

Таким образом, вы можете описать «не работает " утверждение более подробно.

+1

Спасибо всем! Наверное, я забыл что-то, потому что решение действительно работает. Тем не менее, я многому научился, и поэтому это письмо стоило того. Я ценю помощь. – DirkLX

2

Я не совсем уверен, чего вы пытаетесь достичь, но если ваша цель просто оставить только строки, где в колонке NozamaTitle появится слово «собака», вам просто нужно использовать dplyr::filter. Использование chickwts в качестве примера вместо минимальной воспроизводимой например:

levels(chickwts$feed) 
# [1] "casein" "horsebean" "linseed" "meatmeal" "soybean" 
# [6] "sunflower" 

df <- filter(chickwts, grepl("bean", feed)) 
df 
# weight  feed 
# 1  179 horsebean 
# 2  160 horsebean 
# 3  136 horsebean 
# ... 
# 11 243 soybean 
# 12 230 soybean 
# 13 248 soybean 
# ... 

Это то, что вы после этого?

+0

нет. выше отлично. спасибо! – DirkLX

Смежные вопросы