dplyr

2014-09-12 26 views
12

ile bir faktörün sayımlarının özetlenmesi Bir veri çerçevesini bir sütun (sahibi) ile gruplamak ve her bir gözlemde her bir faktör türüne sahip yeni bir veri çerçevesi oluşturmak istiyorum. Gerçek veri çerçevesi oldukça büyük ve 10 farklı faktör var.dplyr

library(dplyr) 
df = tbl_df(data.frame(owner=c(0,0,1,1), obs1=c("quiet", "loud", "quiet", "loud"), obs2=c("loud", "loud", "quiet", "quiet"))) 

    owner obs1 obs2 
1  0 quiet loud 
2  0 loud loud 
3  1 quiet quiet 
4  1 loud quiet 

Ben çıktı arıyordu şuna benzer::

out = data.frame(owner=c("0", "0", "1", "1"), observation=c("obs1", "obs2", "obs1", "obs2"), quiet=c(1, 0, 1, 2), loud=c(1, 2, 1, 0)) 

    owner observation quiet loud 
1  0  obs1  1 1 
2  0  obs2  0 2 
3  1  obs1  1 1 
4  1  obs2  2 0 

Erime partway orada beni alır: Burada

bazı örnek girişidir

melted = tbl_df(melt(df, id=c("owner"))) 

    owner variable value 
1  0  obs1 quiet 
2  0  obs1 loud 
3  1  obs1 quiet 
4  1  obs1 loud 
5  0  obs2 loud 
6  0  obs2 loud 
7  1  obs2 quiet 
8  1  obs2 quiet 

Ama ne son adım? Eğer 'değer' bir sayısal ise, sadece giderim:

melted %>% group_by(owner, variable) %>% summarise(counts=sum(value)) 

Çok teşekkürler!

+0

Bu eski bir soru ama buna değer ne için yapmanız dcast' 'bir az bilinen bir özelliği var verir

library(dplyr) library(tidyr) gather(df, key, value, -owner) %>% group_by(owner, key, value) %>% tally %>% spread(value, n, fill = 0) 

olduğunu Bu durumlarda bir toplama/özet fonksiyonu uygulayın. Bence saymaya değer. – shadowtalker

cevap

22

Sen sen listeler halinde bölebilirsiniz dplyr vazgeçmek istese çıktı üretmesi

# owner observation loud quiet 
    #1  0  obs1 1  1 
    #2  0  obs2 2  0 
    #3  1  obs1 1  1 
    #4  1  obs2 0  2 
+1

'df%>% toplaması (gözlem, Val, obs1: obs2)%>% group_by (sahip, değişken, değer)%>% özetler (n = n())%>% spread (value, n, fill = 0) –

+0

@Rory Kirchner Sütun adları tutarlı olmalıdır. Burada, '(') toplamasında bir 'Val' değişkeni yarattınız, ama 'group_by (...) 'de ve daha sonra bu değişken atıldı ve yerlerinde" değer "kullanıldı. – akrun

+0

Hm-- Val -> benim için değer: df%>% toplamak (gözlem, Val, obs1: obs2) -> sütun adları olarak sahip değişken değeri –

3

verir dplyr

library(dplyr) 
library(tidyr) 

df %>% 
gather(observation, Val, obs1:obs2) %>% 
group_by(owner,observation, Val) %>% 
summarise(n= n()) %>% 
ungroup() %>% 
spread(Val, n, fill=0) 

ile tidyr kullanabilirsiniz. Eğer count istiyorsa

df <- split(df, list(df[[obs1]], df[[obs2]]) 

, sadece listeleri aracılığıyla çalıştırmak ve her birinin sayım sonucuna varmak için bir sapply veya lapply çağrıyı oluşturun. Ya da tam olarak istediğiniz herhangi bir işlev.

19

2017 yılında cevabı çıktı üretmesi

Source: local data frame [4 x 4] 
Groups: owner, key [4] 

    owner key loud quiet 
* <dbl> <chr> <dbl> <dbl> 
1  0 obs1  1  1 
2  0 obs2  2  0 
3  1 obs1  1  1 
4  1 obs2  0  2 
+0

Bu günlerde daha iyi bir cevap. – Monduiz