2016-02-28 3 views
0

Я пытаюсь заменить все вызовы subset в моем скрипте с помощью dplyr: Вот проблема, с которой я сталкиваюсь при попытке подмножества данных.Функция фильтра 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 
+0

Не могли бы вы описать то, что вывод, который вы пытаетесь достичь это? –

+0

Я ожидаю получить результат самого последнего примера 'filter (d, col1% in% filter (f, flag == 'blue') $ col3)' – Melka

+0

Очень сумасшедший, как мой вопрос был опущен. Это законная проблема, потенциально влияющая на результаты, получаемые от этой функции. – Melka

ответ

1

Вложения функций с нестандартной оценкой (как filter), кажется, как рожон; это очень сложно для dplyr, что вы хотите оценить выражение col1 в двух разных средах (f и 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) 
+0

Знаете ли вы, почему он работает с 'subset'? – Melka

+0

Нет, не знаю. Чтобы понять это, вам придется копаться (например, смотреть на код) и точно анализировать, как нестандартная оценка выполняется в каждом случае. 'subset()' просто использует 'eval_parent',' filter' использует машины из пакета 'lazyeval'. –

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