dplyr过滤器函数与列名冲突

时间:2016-02-28 02:18:27

标签: r dplyr subset

我尝试使用subset替换脚本中的所有dplyr次调用: 这是我在尝试子集数据时遇到的问题。

options(stringsAsFactors=F, width=175)
library(dplyr)

d <- data.frame(
    col1 = c('a', 'b', 'c', 'd'),
    col2 = c(1, 2, 3, 4))

f <- data.frame(
    col1 = c('a', 'd', 'c'),
    col2 = c('a', 'd', 'c'),
    col3 = c('a', 'd', 'c'),
    flag = c('blue', 'blue', 'red'))

filter(d, col1 %in% filter(f, flag == 'blue')$col1)
filter(d, col1 %in% filter(f, flag == 'blue')$col2)
filter(d, col1 %in% filter(f, flag == 'blue')$col3)

输出

> filter(d, col1 %in% filter(f, flag == 'blue')$col1)
[1] col1 col2
<0 rows> (or 0-length row.names)
> filter(d, col1 %in% filter(f, flag == 'blue')$col2)
Error: invalid subscript type 'double'
> filter(d, col1 %in% filter(f, flag == 'blue')$col3)
  col1 col2
1    a    1
2    d    4

看起来它取决于列的名称。 这是预期的吗?我做错了什么?

谢谢!

会话:

R version 3.2.0 (2015-04-16)
Platform: x86_64-unknown-linux-gnu (64-bit)
Running under: CentOS release 6.6 (Final)

locale:
 [1] LC_CTYPE=en_CA.UTF-8       LC_NUMERIC=C               LC_TIME=en_CA.UTF-8        LC_COLLATE=en_CA.UTF-8     LC_MONETARY=en_CA.UTF-8    LC_MESSAGES=en_CA.UTF-8   
 [7] LC_PAPER=en_CA.UTF-8       LC_NAME=C                  LC_ADDRESS=C               LC_TELEPHONE=C             LC_MEASUREMENT=en_CA.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] dplyr_0.4.3

loaded via a namespace (and not attached):
[1] lazyeval_0.1.10 magrittr_1.5    R6_2.1.1        assertthat_0.1  parallel_3.2.0  tools_3.2.0     DBI_0.3.1       Rcpp_0.12.0

1 个答案:

答案 0 :(得分:1)

使用非标准评估嵌套函数(如filter)似乎要求麻烦; dplyr要在两个不同的环境(col1f)中评估表达式d,这非常棘手。以下任何一种都可以使用:

filter(d, col1 %in% filter(f,flag=="blue")[["col1"]])

filter(d,col1 %in% f$col1[f$flag=="blue"])

vals <- filter(f,flag=="blue")$col1
filter(d,col1 %in% vals)