2016-01-06 284 views
5

使用dplyr彙總數據集,我想調用n_distinct來計算列中唯一出現次數。但是,我也想對另一列中的條件滿足的列中的所有唯一事件進行另一個總結()。dplyr n_distinct與條件

實例數據框名爲 「一」:

A B 
1 Y 
2 N 
3 Y 
1 Y 

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

不過,我也想添加的n_distinct(A)計數,其中B == "Y"

結果應該是:

count 
    3 

當你添加con dition結果應該是:

count 
    2 

最終的結果我想實現的是兩個語句合併成一個電話,讓我像

count_all count_BisY 
     3   2 

結果什麼是適當的方式去了解這個與dplyr?

+0

你能嘗試使用:一%>%摘要(計數= n_distinct(A [B == 'Y']) )? – Gopala

+0

@ user3949008錯誤:n_distinct()的輸入必須是數據集中的單個變量名稱 –

+0

對不起,此工程適用於n_distinct(df $ A [df $ B =='Y'])。 – Gopala

回答

6

一種替代方法是使用uniqueN函數從data.table內部dplyr

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

其給出:

count_all count_BisY 
1   3   2 

你也可以做的一切與data.table

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

可以得到相同的結果。

3

過濾數據幀之前進行總結工作

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

據我所知,對於不清楚的道歉,我的最終目標是在一張表中顯示總計數和B ==「Y」的計數。我可以分別做每個並將它們混合在一起,我想 –

+0

你可以用group_by(B)替換filter()嗎?這是否讓你得到你想要的? – Gopala

+0

是的,其實我認爲這是有效的,它只是增加了一個額外的列和額外的行,我真的可以鞏固它有一個列代表'B =='Y''的數量。我意識到這不是整潔的數據,但它是我正在努力實現的 –

4

這使用dplyr生成B的每個值的不同A計數。

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

這產生的結果:

Source: local data frame [2 x 2] 

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

爲了產生上述使用dplyr加入所期望的輸出,則可以執行以下操作:

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

這產生的結果:

count_all count_BisY 
1   3   2 
1

我們c基於該OP的預期輸出也使用aggregatebase R

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

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

是的當然,聚合對我來說非常直觀,但我一直在嘗試學習dplyr語言,因爲它基準速度更快,接受的不僅僅是數據幀 –

+0

@RyanCastner感謝您的反饋。但是,在某些情況下,我發現有'基礎R'解決方案是有用的。例如,最近,我不得不在Alteryx中通過操作實現一個組,但是可用版本在使用dplyr時遇到了一些問題。所以,不得不求助於基地R. – akrun