2014-12-29 17 views
16

Kullanıcının, işlev çağrısında bir veya daha fazla gruplama değişkenini tanımlaması istenen bir işlev yazıyorum. Veriler daha sonra dplyr kullanılarak gruplandırılır ve sadece bir gruplama değişkeni varsa beklendiği gibi çalışır, ancak birden fazla gruplama değişkeniyle nasıl yapılacağını anlamadım.dplyr :: group_by_, çeşitli değişken adlarının karakter dizisi girdisi ile

Örnek:

x <- c("cyl") 
y <- c("cyl", "gear") 
dots <- list(~cyl, ~gear) 

library(dplyr) 
library(lazyeval) 

mtcars %>% group_by_(x)    # groups by cyl 
mtcars %>% group_by_(y)    # groups only by cyl (not gear) 
mtcars %>% group_by_(.dots = dots) # groups by cyl and gear, this is what I want. 

kullanıyorum dots aynı içine y döndürmeye çalışmışlardır:

> 1 değişken adlarında (içinde y gibi bir kullanıcı tanımlı giriş dizesi nasıl kullanılır
mtcars %>% group_by_(.dots = interp(~var, var = list(y))) 
#Error: is.call(expr) || is.name(expr) || is.atomic(expr) is not TRUE 

örnek) verileri dplyr kullanarak gruplamak için?

(Bu soru nasılsa this one ilgili değil, orada cevap verdi.)

+0

Bu yüzden 'data.table' :)' as.data.table (mtcars) [, sum (carb), y] 'j/k 'yi kullanmaya başlamalısınız. İyi soru olsa da. –

+2

Bir gün belki yapabilirim :) Ama şimdilik dplyr ile yapışacağım .. –

cevap

17

gerek yok interp burada, sadece formüllere dizeleri dönüştürmek için as.formula kullanın:

dots = sapply(y, . %>% {as.formula(paste0('~', .))}) 
mtcars %>% group_by_(.dots = dots) 

nedeni sizin interp yaklaşım işe yaramadı ifadenin size geri döndürdüğüdür:

- ne istediğini değil.

dots1 = sapply(y, . %>% {interp(~var, var = .)}) 

Ama, aslında, aynı zamanda doğrudan y geçebilir: Sen, sapplyinterpy üzerinde elbette yukarıda as.formula kullanmaya benzer olacağını hangi

mtcars %>% group_by_(.dots = y) 

dplyr vignette on non-standard evaluation daha ayrıntılı olarak gider ve bu yaklaşımlar arasındaki farkı açıklar. Şimdi bu group_by_() amortisman edilmiştir

y <- c("cyl", "gear") 
mtcars_grp <- mtcars %>% purrrlyr::slice_rows(y) 

class(mtcars_grp) 
#> [1] "grouped_df" "tbl_df"  "tbl"  "data.frame" 

group_vars(mtcars_grp) 
#> [1] "cyl" "gear" 

Özellikle kullanışlı: kolon adları (şeritler) ya da pozisyonlar (tamsayı) bir vektör alarak purrrlyr paketi (https://github.com/hadley/purrrlyr) grupları, bir data.frame den

+0

@David Kullanmayacağım. OP’in bir karakter vektörünün formüllerin bir vektörüne nasıl dönüştürüleceğine dair doğrudan sorusunu yanıtlamak için gösteriyorum. Yani, * bir fark (formüller bir ortam ekli ile birlikte gelir), ve genel olarak dplyr belgeleri, karakter dizileri üzerinde formüller kullanılmasını önerir. Ancak, bu durumda, çevre biraz işe yaramaz. –

+0

Bu yazım için çok teşekkürler, Konrad-Rudolph. Bana çok acı verdi. Sapply işlevini anlamakta sorun yaşıyorum ... "." içinde? – SFuj