R中的dplyr中的过滤功能不起作用

GKy*_*yle 14 r dplyr

我在R中有一个像所谓的数据框UK_profiles:

row.names   id     name
1   1   8131437     Profile
2   2   8131719     WolverineCompetition
3   4   8132011     www.vaseline.com
4   10  23265829    www.keepingskinamazing.co.uk
5   23  8042743     Mobile
6   24  8043312     Test
7   25  90914664    Join Our Core
8   26  45272695    UDF
9   27  50547829    apps.euro-bureau.eu/fairathon
10  28  50916438    www.benjerry.intashop.com/
11  44  83667343    All Web Site Data
12  45  84556272    UK
Run Code Online (Sandbox Code Playgroud)

使用dplyr我希望使用grepl过滤和删除行:

require(dplyr) 

UK_profiles.filtered <- filter(UK_profiles, !grepl("Rollup|Microsite|Mobile|Test|tset|Profile|Facebook|Unfiltered|returnurl", name))
Run Code Online (Sandbox Code Playgroud)

但是,我收到一个错误说:

找不到对象'名称'.

我也得到:

在data.matrix(数据)中:强制引入的NA.

该对象filter显然在数据框中.有人可以帮忙吗?

Spa*_*man 48

看起来你似乎得到了stats::filter功能,而不是那个dplyr.为了确保您获得正确的,请使用符号dplyr::filter.

d = data.frame(x=1:10,
 name=c("foo","bar","baz","bar","bar","baz","fnord","qar","qux","quux"))

filter(d, !grepl("ar|ux", name))
Error in grepl("ar|ux", name) : object 'name' not found

dplyr::filter(d, !grepl("ar|ux", name))
  x  name
1 1   foo
2 3   baz
3 6   baz
4 7 fnord
Run Code Online (Sandbox Code Playgroud)

你甚至不需要library(dplyr)为此工作 - 你确实需要dplyr安装.

这适用于任何包的功能.


小智 8

要了解为什么会发生这种情况,您可以按照以下步骤非常直接地重新创建错误。

加载 dplyr

加载dplyr到仅加载默认库的新会话中,filter将在dplyr加载后工作stats

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union

filter(mtcars, mpg < 15)
#>    mpg cyl disp  hp drat    wt  qsec vs am gear carb
#> 1 14.3   8  360 245 3.21 3.570 15.84  0  0    3    4
#> 2 10.4   8  472 205 2.93 5.250 17.98  0  0    3    4
#> 3 10.4   8  460 215 3.00 5.424 17.82  0  0    3    4
#> 4 14.7   8  440 230 3.23 5.345 17.42  0  0    3    4
#> 5 13.3   8  350 245 3.73 3.840 15.41  0  0    3    4
Run Code Online (Sandbox Code Playgroud)

卸载 dplyr

这会导致错误,因为现在尝试使用stats::filter. 通过卸载,stats我们看到另一个错误,即根本没有filter找到调用的函数

detach("package:dplyr")  # Unload dplyr
filter(mtcars, mpg < 15)  # Using stats::filter
#> Error in filter(., mpg < 15): object 'mpg' not found

detach("package:stats")  # Unload stats

filter(mtcars, mpg < 15)    
#> Error in filter(., mpg < 15): could not find function "filter"
Run Code Online (Sandbox Code Playgroud)

重新加载统计信息和 dplyr

确保dplyr之后重新加载stats,我们会看到该dplyr版本filter再次有效

library(stats)
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> 
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union

filter(mtcars, mpg < 15)
#>    mpg cyl disp  hp drat    wt  qsec vs am gear carb
#> 1 14.3   8  360 245 3.21 3.570 15.84  0  0    3    4
#> 2 10.4   8  472 205 2.93 5.250 17.98  0  0    3    4
#> 3 10.4   8  460 215 3.00 5.424 17.82  0  0    3    4
#> 4 14.7   8  440 230 3.23 5.345 17.42  0  0    3    4
#> 5 13.3   8  350 245 3.73 3.840 15.41  0  0    3    4
Run Code Online (Sandbox Code Playgroud)