【问题标题】:dplyr filter function in combination with agrepdplyr 过滤功能结合 agrep
【发布时间】:2015-12-12 12:09:26
【问题描述】:

我正在尝试仅过滤表中标题列中包含“dog”一词的行,但我无法使其正常工作。

这是一个数据示例:

    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 行的结果为 TRUE。感谢您提供任何帮助。谢谢

【问题讨论】:

  • @DrikLX 请不要在sn-ps不起作用时添加代码
  • 此外:包含reproducible example 时,您更有可能得到一个好的答案
  • @jaap,我不同意你的第一条评论——如果他们没有提供任何代码,人们会问他们“你试过什么?”如果人们能告诉他们为什么他们的方法失败了,这对他们来说将是一个更好的学习。
  • @jaap,在这种情况下我同意你的看法。
  • 我注意到您没有接受您之前提出的任何问题的任何答案。尽管接受答案不是强制性的,但如果其中一个答案对您有用,那么这样做被认为是一种好的做法。这将为未来的读者提供有关解决方案价值的线索。另请参阅此帮助页面:What should I do when someone answers my question?

标签: r dplyr agrep


【解决方案1】:

你很亲密,你只需要摆脱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))

编辑:您的原始代码:

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

确实有效。尽管它包含几个不需要的组件(ifelse-statement 和在标准 dplyr 函数中使用 data$column),但它给出了所需的结果:

> 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

因此,您可能需要更详细地描述 “不起作用” 语句。

【讨论】:

  • 谢谢大家!我想我忽略了一些东西,因为该解决方案确实有效。但是,我学到了很多东西,所以写这篇文章是值得的。感谢您的帮助。
【解决方案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
# ...

这就是你所追求的吗?

【讨论】:

    猜你喜欢
    • 2018-10-29
    • 2019-06-12
    • 1970-01-01
    • 2021-10-22
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    相关资源
    最近更新 更多