2013-04-18 41 views
10

Tôi muốn đếm số lần xuất hiện của một yếu tố trong một khung dữ liệu. Ví dụ, để đếm số lượng các sự kiện của một loại nhất định trong các mã dưới đây:Đếm số lần xuất hiện của hệ số trong R, với tổng số không được báo cáo

library(plyr) 
events <- data.frame(type = c('A', 'A', 'B'), 
         quantity = c(1, 2, 1)) 
ddply(events, .(type), summarise, quantity = sum(quantity)) 

Kết quả như sau:

 type quantity 
1 A  3 
2 B  1 

Tuy nhiên, những gì nếu tôi biết rằng có ba loại sự kiện A, BC và tôi cũng muốn xem số lượng cho C0? Nói cách khác, tôi muốn đầu ra là:

 type quantity 
1 A  3 
2 B  1 
3 C  0 

Làm cách nào để thực hiện việc này? Nó cảm thấy như có nên có một chức năng được định nghĩa để làm điều này ở đâu đó.

Sau đây là hai ý tưởng không tốt của tôi về cách thực hiện việc này.

Idea # 1: Tôi biết tôi có thể làm điều này bằng cách sử dụng một vòng lặp for, nhưng tôi biết rằng nó được nói rộng rãi rằng nếu bạn đang sử dụng một vòng lặp for trong R, sau đó bạn đang làm điều gì sai, có phải là một cách tốt hơn để làm điều đó.

Ý tưởng # 2: Thêm mục nhập giả vào khung dữ liệu gốc. Giải pháp này hoạt động nhưng nó cảm thấy như cần có một giải pháp thanh lịch hơn.

events <- data.frame(type = c('A', 'A', 'B'), 
         quantity = c(1, 2, 1)) 
events <- rbind(events, data.frame(type = 'C', quantity = 0)) 
ddply(events, .(type), summarise, quantity = sum(quantity)) 
+1

'e <- sapply (sự kiện, FUN = as.factor); bảng (e) ' – isomorphismes

Trả lời

19

Bạn có được điều này miễn phí nếu bạn xác định biến events của bạn một cách chính xác là một yếu tố với mong muốn ba cấp độ:

R> events <- data.frame(type = factor(c('A', 'A', 'B'), c('A','B','C')), 
+      quantity = c(1, 2, 1)) 
R> events 
    type quantity 
1 A  1 
2 A  2 
3 B  1 
R> table(events$type) 

A B C 
2 1 0 
R> 

Đơn giản chỉ cần gọi table() trên yếu tố đã làm điều đúng, và ddply() thể quá nếu bạn nói nó không drop:

R> ddply(events, .(type), summarise, quantity = sum(quantity), .drop=FALSE) 
    type quantity 
1 A  3 
2 B  1 
3 C  0 
R> 
+0

+ 1 và xóa mỏ. – mnel

+0

+1 vì lý do tương tự ... :-) –

4
> xtabs(quantity~type, events) 
type 
A B C 
3 1 0 
+0

Doh, thậm chí tốt hơn. Tốt đẹp. Bằng cách nào đó tôi luôn quên về 'xtabs'. Nhưng cũng cần biến yếu tố đã sửa mà tôi hiển thị. –

+0

Tôi chỉ sử dụng dữ liệu của OP. Có một 'tổng hợp' trong 'xtabs'. –

0

Khá tương tự như @ DWin của câu trả lời:

> aggregate(quantity~type, events, FUN=sum) 
    type quantity 
1 A  3 
2 B  1 
3 C  0 
+0

Cần biến yếu tố đã sửa như trong câu trả lời của tôi. –

+0

@DirkEddelbuettel Hoặc định nghĩa của anh ấy, với các mục nhập giả (những gì tôi thực sự đã sử dụng). –

+0

Số tiền nào giống nhau theo cách phức tạp hơn - biến char được chuyển thành một nhân tố sau đó bằng tổng hợp. –

1

Sử dụng dplyr thư viện

library(dplyr) 
data <- data.frame(level = c('A', 'A', 'B', 'B', 'B', 'C'), 
        value = c(1:6)) 

data %>% 
    group_by(level) %>% 
    summarize(count = n()) %>% 
    View 

Nếu bạn cũng có thể chọn để thực hiện trung bình, min, hoạt động tối đa, cố gắng này

data %>% 
    group_by(level) %>% 
    summarise(count = n(), Max_val = max(value), Min_val = min(value)) %>% 
    View 
Các vấn đề liên quan