2015-05-27 22 views
5

Tôi biết rằng a little programming cho phép chuyển đổi các bảng tần số kích thước cố định, như được trả về, ví dụ: bởi table(), trở lại dữ liệu quan sát. Vì vậy, mục đích là để chuyển đổi một bảng tần số như thế này ...Có một nghịch đảo chung của hàm table() không?

(flower.freqs <- with(iris,table(Petal=cut(Petal.Width,2),Species))) 
      Species 
Petal   setosa versicolor virginica 
    (0.0976,1.3]  50   28   0 
    (1.3,2.5]   0   22  50 

... trở thành một data.frame() với một số hàng tương ứng với tổng các số của ma trận đầu vào, trong khi các tế bào giá trị thu được từ kích thước đầu vào:

 Petal Species 
1 (0.0976,1.3] setosa 
2 (0.0976,1.3] setosa 
3 (0.0976,1.3] setosa 
# ... (150 rows) ... 

Với một số phiên bản tôi xây dựng một nguyên mẫu thô mà cũng nên tiêu hóa đầu vào cao hơn chiều:

tableinv <- untable <- function(x) { 
    stopifnot(is.table(x)) 
    obs <- as.data.frame(x)[rep(1:prod(dim(x)),c(x)),-length(dim(x))-1] 
    rownames(obs) <- NULL; obs 
} 

> head(tableinv(flower.freqs)); dim(tableinv(flower.freqs)) 
    Petal Species 
1 (0.0976,1.3] setosa 
2 (0.0976,1.3] setosa 
3 (0.0976,1.3] setosa 
4 (0.0976,1.3] setosa 
5 (0.0976,1.3] setosa 
6 (0.0976,1.3] setosa 
[1] 150 2 
> head(tableinv(Titanic)); nrow(tableinv(Titanic))==sum(Titanic) 
    Class Sex Age Survived 
1 3rd Male Child  No 
2 3rd Male Child  No 
3 3rd Male Child  No 
4 3rd Male Child  No 
5 3rd Male Child  No 
6 3rd Male Child  No 
[1] TRUE 

tôi obvio usly tự hào rằng bricolage này tái tạo lại nhiều thuộc tính data.frame() s từ các bảng tần số cao hơn như Titanic - nhưng có một nghịch đảo tổng quát (được xây dựng trong chiến đấu) được thiết lập để bàn(), lý tưởng không phụ thuộc vào thư viện cụ thể, biết cách xử lý các tham số không được gắn nhãn, được tối ưu hóa để nó không bị nghẹt vào đầu vào cồng kềnh, và giao dịch hợp lý với các đầu vào bảng tương ứng với yếu tố cũng như các yếu tố đầu vào không có yếu tố?

+3

Không biết nếu có một nghịch đảo của 'bảng', nhưng tôi đoán bạn có thể cải thiện mã của bạn một chút. Ví dụ, tôi chỉ muốn thử: 'lev <-expand.grid (dấu (mytable)); lev [rep (1: nrow (lev), as.vector (mytable)),]' – nicola

+0

@Nicola: Bạn là đúng, cảm ơn. Và một bình luận tạm thời khác (rằng một người nào đó đã rút lại một lần nữa) cũng gợi ý rằng 'as.data.frame.table()' sẽ mang lại cho chúng ta nửa chừng ... – texb

+1

Không nhất thiết phải tốt hơn, nhưng một khi bạn sử dụng 'as.data.frame' , bạn có thể: 'DF [đại diện (rownames (DF), DF $ Freq), -ncol (DF)]' mà bề ngoài có vẻ đơn giản hơn một chút. – BrodieG

Trả lời

0

Tôi tin rằng giải pháp của bạn khá tốt. Trong mọi trường hợp, cách tôi sẽ giải quyết câu hỏi này là khá tương tự:

tableinv <- function(x){ 
     y <- x[rep(rownames(x),x$Freq),1:(ncol(x)-1)] 
     rownames(y) <- c(1:nrow(y)) 
     return(y)} 
survivors <- as.data.frame(Titanic) 
surv.invtab <- tableinv(survivors) 

trong đó sản lượng

> head(surv.invtab) 
    Class Sex Age Survived 
1 3rd Male Child  No 
2 3rd Male Child  No 
3 3rd Male Child  No 
4 3rd Male Child  No 
5 3rd Male Child  No 
6 3rd Male Child  No 

Liên quan đến ví dụ với những bông hoa, sử dụng chức năng tableinv() như đã định nghĩa ở trên, đầu tiên nó sẽ là cần thiết để chuyển đổi dữ liệu vào một khung dữ liệu:

flower.freqs <- with(iris,table(Petal=cut(Petal.Width,2),Species)) 
flower.freqs <- as.data.frame(flower.freqs) 
flower.invtab <- tableinv(flower.freqs) 

kết quả trong trường hợp này là

01.
> head(flower.invtab) 
     Petal Species 
1 (0.0976,1.3] setosa 
2 (0.0976,1.3] setosa 
3 (0.0976,1.3] setosa 
4 (0.0976,1.3] setosa 
5 (0.0976,1.3] setosa 
6 (0.0976,1.3] setosa 

Hy vọng điều này sẽ hữu ích.

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