2016-07-07 22 views
6

kullanarak filter() yapıyorum, ancak dplyr çevirisinin yolu yanlış görünüyor. Aslında, %in% operatörü, birden fazla değere sahip olarak iyi çalışır, ancak yalnızca tek bir öğenin mevcut olmadığı zaman olmaz. Orijinal senaryomda filtreleme değerleri dinamiktir, bu yüzden her iki durumda da çalışan bir fonksiyona sahip olmak isterim.Uzak tablo, tek bir değere göre nasıl filtrelenir?

my_db <- src_mysql(dbname = "dplyr", 
        host = "dplyr.csrrinzqubik.us-east-1.rds.amazonaws.com", 
        port = 3306, 
        user = "dplyr", 
        password = "dplyr") 
tbl(my_db, "dplyr") %>% filter(carrier %in% c("UA","AA")) #works 
tbl(my_db, "dplyr") %>% filter(carrier %in% c("UA")) #doesn't work 

Sorum multiple selectInput values create unexpected dplyr (postgres) behavior kopyasıdır. this issue gibi iyi bilinen de

+2

sürümü nedir? SQL çeviri yapısı 0.5.0 olarak değiştirildi. – alistaire

+0

@alistaire 4.3 kullanıyordum, şimdi güncelledim ama sorun hala var. – Dambo

+2

bunu% c ("Sanat", "some_absent_junk") '% olarak kullanarak bu konuda uğraşabilir miydiniz? (yetersiz, ama bir geçici çözüm olarak yararlı olabilir) –

cevap

0

Bazı önerileri bir araya getirdiğimde, senaryo için en iyi yaklaşım muhtemelen aşağıdaki gibi olacaktır. filter()'un if ifadesinde yer almasını istemememin nedeni, parlak bir uygulamanın menü öğelerinden birden fazla filter olmasıdır. Böylece, değişkeni kaynağında manipüle etmek beni çok fazla yazarak kurtarıyor.

a <- c("UA") 
b <- if(length(a)>1) a else c(a,"") 
tbl(my_db, "dplyr") %>% 
    filter(carrier %in% b) 

Veya dplyr ait

a <- c("UA") 
varToFilterFor <- rep(a ,2) 
tbl(my_db, "dplyr") %>% 
     filter(carrier %in% varToFilterFor) 
3

Kodunuzun neden başarısız olduğuyla ilgili hiçbir bilgi sunamıyorum. Ama birisi daha iyi bir çözüm sunana kadar, burada "her iki durumda da işe yarayan bir işlev" sağlayan basit bir çalışma var.

my.carriers <- c("UA","AA") 
my.carriers <- c("UA") 

if (length(my.carriers)>1) { 
    tbl(my_db, "dplyr") %>% filter(carrier %in% my.carriers) 
} else { 
    tbl(my_db, "dplyr") %>% filter(carrier == my.carriers) 
} 
+0

Evet, soruma eklediğim bağlantıda önerilen budur. Ben ifelse() de düşünüyorum, ama performans açısından eşdeğer olup olmayacağından emin değilim. – Dambo

+0

1 denemem olarak ifelse'i denedim - işe yaramaya gelemedim. Bazı nedenlerle sorgu için yanıt beklemek gibi görünmüyor – dww

+0

Muhtemelen 'ifelse' vektörünün '' test ile aynı şekle bir değer döndürmesi '' 'nin vectorization'undan kaynaklanmaktadır. Bu örnek, neden çalışmadığını anlamamı sağladı. D <- c ("AA", "AA", "EV", "DL") a <- c ("UA", "AA") ifelse (uzunluk (a)> 1, d% d içinde d% d == a) (uzunluk (a)> 1) {a% {d% a} else {d == a} ' – Dambo

İlgili konular