table()函数是否有一般反转?

tex*_*exb 8 r

我知道一点点编程允许将固定维度的频率表(例如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
Run Code Online (Sandbox Code Playgroud)

...返回到一个data.frame()行号,该行号对应于输入矩阵的数字之和,而单元格值是从输入维度获得的:

     Petal Species
1 (0.0976,1.3]  setosa
2 (0.0976,1.3]  setosa
3 (0.0976,1.3]  setosa
# ... (150 rows) ...
Run Code Online (Sandbox Code Playgroud)

通过一些修修补补,我构建了一个粗略的原型,它也应该消化更高维度的输入:

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
Run Code Online (Sandbox Code Playgroud)

我很自然这个结合data.frame()从高维频率表中重建了多属性,例如Titanic- 但是有没有建立的(内置的,经过实战考验的)与table()相反的一般反转,理想情况是不依赖于特定的库,知道如何处理未标记的维度,这是优化的,以便它不会阻塞大量输入,并合理地处理表格输入,这些输入将对应于因子以及非因子观察输入?

RHe*_*tel 2

我相信你的解决方案非常好。无论如何,我解决这个问题的方式非常相似:

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)
Run Code Online (Sandbox Code Playgroud)

这产生

> 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
Run Code Online (Sandbox Code Playgroud)

对于花的示例,使用tableinv()上面定义的函数,首先需要将数据转换为数据框:

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

本例的结果是

> 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
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。