2009-11-28 39 views
22

tôi đang tìm cách để có được một số cho khung dữ liệu sau:đếm các mục trong khung dữ liệu trong R

> Santa 
    Believe Age Gender Presents Behaviour 
1 FALSE 9 male  25 naughty 
2  TRUE 5 male  20  nice 
3  TRUE 4 female  30  nice 
4  TRUE 4 male  34 naughty 

của số trẻ em người tin. Tôi sẽ sử dụng lệnh nào để có được điều này?

(Khung dữ liệu thực tế lớn hơn nhiều. Tôi vừa đưa cho bạn bốn hàng đầu tiên ...)

Cảm ơn!

Trả lời

35

Bạn có thể sử dụng table:

R> x <- read.table(textConnection(' 
    Believe Age Gender Presents Behaviour 
1 FALSE 9 male  25 naughty 
2  TRUE 5 male  20  nice 
3  TRUE 4 female  30  nice 
4  TRUE 4 male  34 naughty' 
), header=TRUE) 

R> table(x$Believe) 

FALSE TRUE 
    1  3 
14
sum(Santa$Believe) 
+0

Tôi nghĩ đây có lẽ là cách nhanh nhất. – Juan

+0

Đây là giải pháp nhanh nhất cho trường hợp cụ thể này, không nghi ngờ gì về nó. – Arani

21

Tôi nghĩ về điều này như một quá trình hai bước:

  1. tập hợp con các khung dữ liệu gốc theo bộ lọc cung cấp (Believe == FALSE); sau đó

  2. lấy số liệu hàng subset này

Đối với bước đầu tiên, tập con chức năng là một cách tốt để làm điều này (chỉ cần một thay thế cho chỉ số bình thường hoặc khung ký hiệu).

Đối với bước thứ hai, tôi sẽ sử dụng mờ hoặc nrow

Một lợi thế của việc sử dụng tập con: bạn không cần phải phân tích các kết quả nó sẽ trả về để có được kết quả bạn cần - chỉ cần gọi trực tiếp nrow.

như vậy trong trường hợp của bạn:

v = nrow(subset(Santa, Believe==FALSE))  # 'subset' returns a data.frame 

hoặc bọc trong một chức năng ẩn danh:

>> fnx = function(fac, lev){nrow(subset(Santa, fac==lev))} 

>> fnx(Believe, TRUE) 
     3 

Ngoài nrow, mờ cũng sẽ thực hiện công việc. Hàm này trả về kích thước của một khung dữ liệu (hàng, cột) vì vậy bạn chỉ cần cung cấp các chỉ số thích hợp để truy cập vào số lượng hàng:

v = dim(subset(Santa, Believe==FALSE))[1] 

Một câu trả lời cho OP gửi trước một điều này cho thấy sử dụng bảng dự phòng. Tôi không thích cách tiếp cận đó cho vấn đề chung như được đọc trong OP. Đây là lý do. Cấp, vấn đề chung của có bao nhiêu hàng trong khung dữ liệu này có giá trị x trong cột C? có thể được trả lời bằng bảng ngẫu nhiên cũng như sử dụng lược đồ "lọc" (như trong câu trả lời của tôi ở đây).Nếu bạn muốn đếm hàng cho tất cả các giá trị cho biến yếu tố (cột) thì bảng dự phòng (qua số bảng và chuyển qua cột quan tâm) là giải pháp hợp lý nhất; tuy nhiên, OP yêu cầu số lượng giá trị cụ thể là trong biến yếu tố, không được tính trên tất cả các giá trị. Ngoài hit hiệu suất (có thể lớn, có thể là tầm thường, chỉ phụ thuộc vào kích thước của khung dữ liệu và ngữ cảnh xử lý đường ống trong đó chức năng này cư trú). Và tất nhiên sau khi kết quả từ cuộc gọi đến bàn được trả lại, bạn vẫn phải phân tích cú pháp từ kết quả đó chỉ là số mà bạn muốn.

Vì vậy, đó là lý do tại sao, với tôi, đây là một bộ lọc chứ không phải là một vấn đề liên quan đến thẻ chéo.

+5

Ghi chú 'nrow()'. :) – fbmd

+0

Thực tế, 'nrow' chỉ là một trình bao bọc cho' mờ ' – Juan

2

Bạn có thể làm summary(santa$Believe) và bạn sẽ nhận được số lượng cho TRUEFALSE

0

DPLYR làm cho điều này thực sự dễ dàng.

x<-santa%>% 
    count(Believe) 

Nếu bạn muốn đếm bởi một nhóm; ví dụ: có bao nhiêu nam giới v nữ tin rằng, chỉ cần thêm group_by:

x<-santa%>% 
    group_by(Gender)%>% 
    count(Believe) 
Các vấn đề liên quan