【问题标题】:Filter, Subseting Data in R过滤器,R中的子集数据
【发布时间】:2015-11-03 19:32:55
【问题描述】:

我有一个参考表,其中有人们的姓名和属性(坏电子邮件)

我希望根据下面的人名对表格进行子集化

我尝试了两种方法来解决这个问题

# Returns nothing
subset(bad.email, User.Name %in% c('John'))
filter(bad.email, User.Name %in% 'John')

# returns what im looking for
subset(bad.email, grepl("John", User.Name ))
filter(bad.email, grepl("John", User.Name ))

谁能解释为什么会这样?

最后,我想用参考表中的一列替换 john,但我只想先了解一下这个概念

【问题讨论】:

  • 这意味着您在列中有前导/滞后空间。试试library(stringr); bad.email$User.Name <- str_trim(bad.email$User.Name) 你的代码应该可以工作
  • 嗨@akrun。我之前尝试过这个,并且在导入文件时我也设置了 strip.white=TRUE 所以我不确定为什么什么都没有返回
  • 如果没有可重现的例子,我也不确定。这是根据你提到的猜测。
  • 感谢您抽出宝贵的时间,作为一种解决方法,我想我可以将参考表折叠成一个字符串,根据“|”将其拆分并将其输入到 grep 中。
  • %in% 返回完全匹配,而grepl 返回TRUE,只要某个字符串包含此特定模式。不同的东西。比较"a" == "aa" ; grepl("a", "aa")

标签: r filter subset dplyr


【解决方案1】:

基于@akrun 和@David Arenburg 的反馈

前两行代码可能无法工作的原因是该字段中可能存在空白。 最初读取文件时,可以通过设置 strip.white=TRUE 来删除空格。或者使用 stringr 库中的 str_trim(col_name) 也可以这样做

第二个原因是我的代码不起作用的主要原因,即 %in% 与您正在寻找的模式完全匹配。

就我而言,该字段中有姓氏,而我只匹配名字。要解决此问题,可以通过全名匹配或使用 grepl 进行匹配。 grepl 区分大小写,因此添加选项 ignore.case 为 true 将匹配字段同时忽略大小写

# remove whitespace
bad.email$User.Name <- str_trim(bad.email$User.Name)

# returns what im looking for using %in%
subset(bad.email, User.Name %in% c('John Smith'))
filter(bad.email, User.Name %in% 'John Smith')

# returns what im looking for using grepl
subset(bad.email, grepl("John Smith", User.Name, ignore.case = TRUE ))
filter(bad.email, grepl("John Smith", User.Name, ignore.case = TRUE ))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    • 2016-04-11
    • 2020-03-09
    • 2016-05-22
    • 2012-07-06
    相关资源
    最近更新 更多