2014-11-07 7 views
5

Akış stili veri işlemede dplyr paketinin düzgünlüğü beni çok şaşırttı. Son zamanlarda, her grup kimliği için yeni bir veri çerçevesi oluşturmak ve bu küçük veri çerçevelerini son büyük bir veri çerçevesine birleştirmek için bir soruna giriyorum. Bir oyuncak örneği: dplyr olarakGrup_by işleminden sonra dplyr her grup için nasıl veri çerçevesi oluşturabilir?

input.data.frame %>% 
    group_by(gid) %>% 
    {some operation to generate a new data frame for each group} ## FAILED!!!! 

, her bir grup ve her grup için summarise üreten özetleri yeni sütunu ekleyerek işlev mutate, hem benim gereksinimi karşılamak mümkün değil. (Bir şey kaçırdım mı?) Alternatif

, plyr paketinin ddply kullanarak, dplyr önceki interation, ben

ddply(input.data.frame, .(gid), function(x) { 
    some operation to generate a new data frame for each group 
} 

yoluyla yapabilir Ama sıkıntısı dplyr bazı Funcs maskeli olacaktır olduğunu plyr paketini yüklediğimde kullanılabilirlikten.

+2

Böyle bir durumda 'do' operatörünü kullanmanız gerekir. Ancak, sonunda ne yapmak istediğinizi/başarmayı bize göstermiş olsaydınız daha iyi olurdu. Yardım dosyasından: "Bir hesapta saklanacak bir veri çerçevesini veya keyfi nesneleri döndürerek, keyfi hesaplamayı gerçekleştirmek için kullanabilirsin." –

+0

İyi bir giriş "Akış tarzı veri işlemede dplyr paketinin düzgünlüğü beni çok şaşırttı." :) –

+1

Ve bu arada, her iki paketi de (plyr ve dplyr) yüklerseniz, öneri plyr'i önce ve sonra dplyr, yani "standart" paketini yüklemektir. "özetle" dplyr olurdu, ancak eğer plyr'den gerekiyorsa, paketi açık yapmak için sadece 'plyr :: summarise' komutunu kullanın. –

cevap

3

Evet, dplyr her grup için data.frames oluşturmak için bir yol sunar .. bir cevap haline yorumumu Torna. Gruplandırılmış bir data.frame/tbl üzerinde do operatörünü kullanarak bunu yapmanıza izin verir, daha doğrusu, her gruba isteğe bağlı işlevleri uygulamanıza izin verir. Bu do için yardım dosyası belgelenmiştir:

[...] Bir veri çerçeve veya liste halinde saklanır keyfi nesneler ya dönen, keyfi hesaplama gerçekleştirmek için ne kullanabilirsiniz. Bu özellikle modellerle çalışırken kullanışlıdır: grup başına modellerini sığdırmak ve daha sonra esnek bir şekilde ile bir veya daha fazla bileşen oluşturun.

deneyim defa o mutasyon gibi özelleşmiş dplyr işlevlerden birini kullanmak mümkündür ne zaman/özetlemek olmasıdır/genellikle kullanım daha verimlidir çünkü mutate_each/vb, bunlar do üzerinde tercih edilmelidir do, ama elbette esnek olarak değil.

+4

Sorunuzda, bunu nasıl kullanacağınıza ilişkin bir kod snippet'i gösteren bir yanıt verebilir misiniz?Teşekkürler – MartinT

+0

@ user2731872, '' do' yardım sayfasındaki örneklere bakın. Ya da sorunun en az bir örneğini sağlayın, ancak –

+0

numaralı yeni bir soru sorduğunuzda daha iyi olurdu. Teşekkürler - Ben ve hiçbiri akıllıca değilim. Gösterilen örneklerin sonucu, orjinal sorunun burada olduğu, veri çerçevelerinin bir listesinde değil, bir grouped_df ile sonuçlanır, şöyle düşündüm: 'by_cyl <- group_by (mtcars, cyl); yapmak (by_cyl, kafa (., 2)) 'bir gruplandırılmış df ile sonuçlanır. Ben bir dfs listesi istiyorum. Şimdi buradaki soruyu sordum: [link] (http://stackoverflow.com/questions/33775239/emulate-split-with-dplyr-group-by-return-a-list-of-data-frames) – MartinT

6

İşte G. Grothendieck'in yanıtını benzer bir soruyu izleyen bir örnek. Adding rows in `dplyr` output

Önce x ve g ile bir veri çerçevesi oluşturuyoruz. X cinsinden 9 rastgele sayı ve a, b, c cinsinden 3 grup vardır. Her gruptan en büyük 2 sayı seçmek istiyoruz. Geri dönüş değeri olarak bir veri karesi gerektirdiğini hatırlamak önemlidir.

library(dplyr) 
set.seed(1) 
dat <- data.frame(x=runif(9),g=rep(letters[1:3],each=3)) 

dat 
     x g 
1 0.1765568 a 
2 0.6870228 a 
3 0.3841037 a 
4 0.7698414 b 
5 0.4976992 b 
6 0.7176185 b 
7 0.9919061 c 
8 0.3800352 c 
9 0.7774452 c 

## this works 
dat %>% dplyr::group_by(g) %>% do(data.frame(x=tail(sort(.$x),2))) 

## this works too 
dat %>% dplyr::group_by(g) %>% do(.[tail(order(.$x),2),]) 

      x  g 
     (dbl) (fctr) 
1 0.3841037  a 
2 0.6870228  a 
3 0.7176185  b 
4 0.7698414  b 
5 0.7774452  c 
6 0.9919061  c 

## no error, but x is treated as a 1x1 data frame 
dat %>% dplyr::group_by(g) %>% do(x=tail(sort(.$x),2)) 
     g  x 
    (fctr) (chr) 
1  a <dbl[2]> 
2  b <dbl[2]> 
3  c <dbl[2]> 

## you need a function to do more complicated stuff 
top2x <- function(df) { df[tail(order(df$x),2),] } 
dat %>% dplyr::group_by(g) %>% do(top2x(.)) 
+0

bu gerçekten iyi bir açıklama +1 – Dan

İlgili konular