2012-06-04 52 views
16

Tôi có hai cột trong khung dữ liệuđếm Tần số của hai cột trong R

2010 1 
2010 1 
2010 2 
2010 2 
2010 3 
2011 1 
2011 2 

tôi muốn đếm tần số của cả hai cột và nhận được kết quả ở định dạng này

y m Freq 
2010 1 2 
2010 2 2 
2010 3 1 
2011 1 1 
2011 2 1 
+3

Không chắc tại sao điều này đã không được cung cấp, nhưng bạn cũng có thể chỉ làm 'as.data.frame (bảng (df))' –

+0

Vấn đề duy nhất với giải pháp này là nó thực sự một crosstab đúng, mà in một hàng cho 0s quá. Điều này có thể tăng lên nhanh chóng nếu có nhiều giá trị m không được chia sẻ bởi hầu hết các giá trị y. – pyll

Trả lời

19

Nếu dữ liệu của bạn là dataframe df với cột ym

library(plyr) 
counts <- ddply(df, .(df$y, df$m), nrow) 
names(counts) <- c("y", "m", "Freq") 
+1

bạn có thể chuyển đổi câu lệnh đó thành SQL cho tôi không? cảm ơn! –

+3

@DMactheDestroyer lol. Hãy thử thẻ 'SQL'. – Gregor

+0

@DMactheDestroyer [Xem câu trả lời dưới đây, sử dụng sqldf] (https://stackoverflow.com/a/10879629). – zx8754

3

Sử dụng sqldf:

sqldf("SELECT y, m, COUNT(*) as Freq 
     FROM table1 
     GROUP BY y, m") 
3

Nếu bạn đã có một khung dữ liệu rất lớn với nhiều cột hoặc không biết các tên cột trước, một cái gì đó như thế này có thể có ích:

library(reshape2) 
df_counts <- melt(table(df)) 
names(df_counts) <- names(df) 
colnames(df_counts)[ncol(df_counts)] <- "count" 
df_counts  

    y m  count 
1 2010 1  2 
2 2011 1  1 
3 2010 2  2 
4 2011 2  1 
5 2010 3  1 
6 2011 3  0 
2
library(data.table) 

oldformat <- data.table(oldformat) ## your orignal data frame 
newformat <- oldformat[,list(Freq=length(m)), by=list(y,m)] 
6

Một hơn phiên bản data.table thành ngữ của câu trả lời @ ugh sẽ là:

library(data.table) # load package 
df <- data.frame(y = c(rep(2010, 5), rep(2011,2)), m = c(1,1,2,2,3,1,2)) # setup data 
dt <- data.table(df) # transpose to data.table 
dt[, list(Freq =.N), by=list(y,m)] # use list to name var directly 
+0

Nó không chính xác hay không chính xác. Câu trả lời là đúng nhưng có lẽ không thành ngữ như vậy. Bạn nên có lẽ chỉ cần đề xuất một chỉnh sửa thay vì đăng một câu trả lời cạnh tranh. –

+0

Xin chào @DavidArenburg, cảm ơn bạn đã gửi phản hồi. Tôi đoán, tôi nhận được quá nhiều về các ký hiệu .N trong data.table (mặc dù tôi dường như nhớ lại rằng tại thời điểm câu trả lời của Ugh dường như không làm việc cho tôi). Theo đề xuất của bạn, tôi đã chỉnh sửa câu trả lời của ugh và sẽ xóa câu trả lời này, nếu chỉnh sửa được chấp nhận. Cũng thay đổi phần 'không chính xác' trong câu trả lời của riêng tôi. – Richard

+0

@DavidArenburg - Bạn không nên chỉnh sửa câu trả lời để thay đổi thành giải pháp thay thế tốt hơn ([xem nguyên tắc đánh giá mã] (http://meta.stackexchange.com/questions/155538/what-are-the-guidelines-for-reviewing/ 155539 # 155539)). Richard, tạo ra câu trả lời của riêng bạn là điều đúng đắn để làm, P. – Scopey

4

Tôi chưa thấy dplyr câu trả lời chưa. Mã này khá đơn giản.

library(dplyr) 
rename(count(df, y, m), Freq = n) 
# Source: local data frame [5 x 3] 
# Groups: V1 [?] 
# 
#  y  m Freq 
# (int) (int) (int) 
# 1 2010  1  2 
# 2 2010  2  2 
# 3 2010  3  1 
# 4 2011  1  1 
# 5 2011  2  1 

dữ liệu:

df <- structure(list(y = c(2010L, 2010L, 2010L, 2010L, 2010L, 2011L, 
2011L), m = c(1L, 1L, 2L, 2L, 3L, 1L, 2L)), .Names = c("y", "m" 
), class = "data.frame", row.names = c(NA, -7L)) 
Các vấn đề liên quan