2016-01-06 22 views
5

Sử dụng dplyr để tóm tắt tập dữ liệu, tôi muốn gọi n_distinct để đếm số lần xuất hiện duy nhất trong cột. Tuy nhiên, tôi cũng muốn thực hiện một tóm tắt khác() cho tất cả các lần xuất hiện duy nhất trong một cột trong đó một điều kiện trong một cột khác được thỏa mãn.dplyr n_distinct với điều kiện

Ví dụ dataframe tên "a":

A B 
1 Y 
2 N 
3 Y 
1 Y 

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

Tuy nhiên tôi cũng muốn thêm một tội danh n_distinct(A) nơi B == "Y"

Kết quả sẽ là:

count 
    3 

khi bạn thêm con dition kết quả nên là:

count 
    2 

Kết quả cuối cùng tôi đang cố gắng để đạt được là cả hai câu lệnh sáp nhập vào một cuộc gọi mà mang lại cho tôi một kết quả như

count_all count_BisY 
     3   2 

cách thích hợp để đi về việc này là gì với dplyr?

+0

Bạn có thể thử sử dụng: a%>% tóm tắt (count = n_distinct (A [B == 'Y']))? – Gopala

+0

@ user3949008 Lỗi: Nhập vào n_distinct() phải là một tên biến duy nhất từ ​​tập dữ liệu –

+0

Xin lỗi, tác vụ này n_distinct (df $ A [df $ B == 'Y']). – Gopala

Trả lời

6

Một cách khác là sử dụng các chức năng uniqueN từ data.table bên dplyr:

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

mang đến cho:

count_all count_BisY 
1   3   2 

Bạn cũng có thể làm mọi thứ với data.table:

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

mang đến cho kết quả tương tự.

3

Lọc dataframe trước khi thực hiện các công trình Tóm tắt

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

Tôi hiểu rằng, xin lỗi vì không rõ ràng, mục tiêu cuối cùng của tôi là có kết quả khi nó hiển thị tổng số và tổng số B == "Y" trong một bảng. Tôi có thể làm mỗi một cách riêng biệt và cbind chúng lại với nhau tôi giả sử –

+0

Bạn có thể thay thế filter() bằng group_by (B)? Điều đó giúp bạn có được những gì bạn muốn? – Gopala

+0

Thực ra tôi nghĩ rằng các công trình, nó chỉ thêm một cột bổ sung và các hàng bổ sung, nơi tôi thực sự có thể có nó hợp nhất để có một cột đại diện cho số lượng 'B == 'Y''. Tôi nhận ra đây không phải là dữ liệu gọn gàng nhưng đó là những gì tôi đang cố gắng đạt được –

4

Điều này tạo ra giá trị A khác nhau theo từng giá trị của B bằng dplyr.

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

này tạo ra kết quả:

Source: local data frame [2 x 2] 

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

Để sản xuất các đầu ra mong muốn bổ sung trên sử dụng dplyr, bạn có thể làm như sau:

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

này tạo ra kết quả:

count_all count_BisY 
1   3   2 
1

Chúng tôi c một cũng sử dụng aggregate từ base R

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

Dựa trên kết quả mong muốn của OP

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

Vâng, chắc chắn, tổng hợp khá trực quan đối với tôi nhưng tôi đã cố gắng học ngôn ngữ dplyr vì nó tiêu chuẩn tốc độ nhanh hơn và chấp nhận nhiều hơn chỉ dataframes –

+0

@RyanCastner Cảm ơn bạn đã phản hồi. Nhưng, trong một số trường hợp, tôi thấy hữu ích khi có các giải pháp 'cơ sở R'. Ví dụ, gần đây, tôi đã phải thực hiện một nhóm bằng cách hoạt động trong Alteryx, nhưng phiên bản có sẵn có một số vấn đề trong việc sử dụng dplyr. Vì vậy, phải nghỉ mát đến cơ sở R. – akrun

Các vấn đề liên quan