我知道a little programming 允许转换固定维度的频率表,例如,通过table()
,回到观察数据。所以目的是转换频率表,例如这个......
(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
...回到data.frame()
,其行号对应于输入矩阵的数字之和,而单元格值是从输入维度获得的:
Petal Species
1 (0.0976,1.3] setosa
2 (0.0976,1.3] setosa
3 (0.0976,1.3] setosa
# ... (150 rows) ...
通过一些修补,我构建了一个粗略的原型,它也应该消化更高维度的输入:
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
我很自豪这个结合从高维频率表(例如data.frame()
)重建多属性Titanic
,但是有没有建立的(内置的,经过实战检验的)通用逆to table(),理想情况下是一个不依赖于特定库的,它知道如何处理未标记的维度,这是优化的,以便它不会阻塞大量输入,并合理地处理与因子对应的表输入以及非因素观察输入?
答案 0 :(得分:1)
我相信你的解决方案非常好。无论如何,我解决这个问题的方式非常相似:
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)
产生
> 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
关于鲜花的例子,使用上面定义的函数tableinv()
,首先需要将数据转换为数据框:
flower.freqs <- with(iris,table(Petal=cut(Petal.Width,2),Species))
flower.freqs <- as.data.frame(flower.freqs)
flower.invtab <- tableinv(flower.freqs)
这种情况下的结果是
> 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
希望这有帮助。
答案 1 :(得分:0)
在处理一维频率数据的特定情况下,有一种简单的方法。让我们举个例子:
mytable = table(mtcars$cyl)
#### 4 6 8
#### 11 7 14
一个简单的函数来检索扩展的数据:
InvTable = function(tb, random = TRUE){
output = rep(names(tb), tb)
if (random) { output <- base::sample(output, replace=FALSE) }
return(output)
}
InvTable(mytable, T)
#### [1] "4" "8" "8" "4" "4" "6" "6" ...
这并不是用户的确切需求,但我认为在许多类似情况下这可能会很有帮助。 请注意,结果是字符格式的,而这并不是我们总是需要的(因此,如果需要,请添加as.numeric)。