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ố?
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
@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
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