2016-01-06 22 views
5

Veri kümesini özetlemek için dplyr öğesini kullanarak, bir sütundaki benzersiz örnek sayısını saymak için n_distinct öğesini çağırmak istiyorum. Bununla birlikte, başka bir sütundaki bir koşulun karşılandığı bir sütundaki tüm benzersiz oluşumlar için başka bir özet() yapmak istiyorum.dplyr n_distinct koşullu

Örnek dataframe adında "a":

count 
    3 
:

A B 
1 Y 
2 N 
3 Y 
1 Y 

a %>% summarise(count = n_distinct(A))

Ancak ben de B == "Y"

sonucu olmalıdır n_distinct(A) sayımını eklemek istediğiniz Con eklediğinizde

olmalıdır sonucu dition:

count 
    2 

elde etmek çalışıyorum Sonuçta her iki ifadeleri beni bu konuda gitmek için uygun bir yoldur ne

count_all count_BisY 
     3   2 

gibi bir sonuç verir, bir aramanın birleştirilecek olan Dplyr ile? veren

library(dplyr) 
library(data.table) 
a %>% summarise(count_all = n_distinct(A), count_BisY = uniqueN(A[B == 'Y'])) 

:: Özetlersek gerçekleştiren bir alternatif dplyr iç data.table den uniqueN fonksiyonunu kullanmaktır

a %>% 
    filter(B=="Y") %>% 
    summarise(count = n_distinct(A)) 
+0

bir de OP beklenen çıktıya dayanarak base R

aggregate(cbind(count=A)~B, a, FUN=function(x) length(unique(x))) # B count #1 N 1 #2 Y 2 

den aggregate kullanın:%>% özetler (= n_distinct (A sayısı [B == 'Y']))? – Gopala

+0

@ user3949008 Hata: n_distinct() öğesine giriş, –

+0

veri kümesinden tek bir değişken adı olmalıdır. Üzgünüz, bu, n_distinct (df $ A [df $ B == 'Y']) olarak çalışır. – Gopala

cevap

6

çalışır önce

3

dataframe Filtreleme

count_all count_BisY 
1   3   2 

Ayrıca data.table ile her şeyi yapabilirsiniz: aynı sonucu verir

library(data.table) 
setDT(a)[, .(count_all = uniqueN(A), count_BisY = uniqueN(A[B == 'Y']))] 

.

+0

Anladığım kadarıyla, belirsiz olmaları için özür dilerim, hedefimin toplam sayımını gösterdiği bir sonuca ve bir tabloda B == "Y" nin olduğu sonuca ulaşmaktır. Her birini ayrı ayrı yapabilirim ve onları bir araya getirebilirim. –

+0

Sanırım filtreyi() grup_by (B) ile değiştirebilir misiniz? Bu sana istediğini getirir mi? – Gopala

+0

Evet, aslında işe yaradığını düşünüyorum, sadece ek sütun ve ekstra satırlar ekledim; burada gerçekten birleştirmek için 'B ==' Y'' sayısını temsil eden bir sütun var. Bunun düzenli bir veri olmadığını anlıyorum ama bu, –

4

Bu, dplyr kullanarak B'nin her bir değerine göre farklı A sayıları üretir.

library(dplyr) 
a %>% 
    group_by(B) %>% 
    summarise(count = n_distinct(A)) 

Bu

sonucu üretir:

:

a %>% summarise(count_all = n_distinct(A), count_BisY = length(unique(A[B == 'Y']))) 

Bu sonuç üretir:

Source: local data frame [2 x 2] 

     B count 
    (fctr) (int) 
1  N  1 
2  Y  2 

dplyr kullanılarak yukarıda ilave istenen çıkışı üretmek için, aşağıdakileri yapabilirsiniz

count_all count_BisY 
1   3   2 
1

Biz c kullanmakta deneyin edebilir

data.frame(count=length(unique(a$A)), 
      count_BisY = length(unique(a$A[a$B=="Y"]))) 
+0

Evet'e ulaşmaya çalıştığım şey, eminim, agregate benim için oldukça sezgisel ama dplyr dilini öğrenmeye çalışıyordum çünkü daha hızlı hızları karşılaştırıyor ve sadece dataframes –

+0

'dan daha fazlasını kabul ediyor @RyanCastner Geri bildirim için teşekkürler. Ancak, bazı durumlarda 'temel R' çözümlerine sahip olmanın yararını görüyorum. Örneğin, yakın zamanda Alteryx'te bir grubu faaliyete geçirmem gerekiyordu, ancak mevcut sürümde dplyr kullanımı konusunda bazı problemler var. Yani, R'ye başvurmalıyız. – akrun