将具有缺失值的表转换为与原始表相同结构的数据框?

时间:2014-10-22 09:24:13

标签: r data-manipulation

将缺少值的表格转换为与原始表格结构相同的数据框架?

以下两种方法都不起作用,因为它们要么更改结构,要么不使用缺失值:

t1  <- with( mtcars, table( gear,cyl, exclude = NULL  ) ) # the table


     data.frame(t1)
     as.data.frame(t1)
     as.data.frame.table(t1)
     as.data.frame.matrix(t1)

以下代码有效,但我希望找到一个涉及较少写作的解决方案:

library(reshape2)
dcast( data.frame(t1), value.var = "Freq", formula = gear ~ cyl ) 

此SO问题的解决方案不适用于缺失值: How to convert a table to a data frame

也许我太懒了。 :/

3 个答案:

答案 0 :(得分:1)

library(data.table); library(tidyr)
t1  <- with( mtcars, table( gear,cyl, exclude = NULL  ) )
as.data.table(t1) %>% spread(cyl, N)
#   gear 4 6  8 NA
# 1    3 1 2 12  0
# 2    4 8 4  0  0
# 3    5 2 1  2  0
# 4 <NA> 0 0  0  0

答案 1 :(得分:1)

问题是,您在“t1”结果中看到的NA实际上是NA中的dimnames值,因此您无法直接使用{{1} }}

我想如果你这么做并希望保存打字,最好的办法可能是编写如下函数:

as.data.frame.matrix

使用它时,它会将dimFixDF <- function(intable) { as.data.frame.matrix(`dimnames<-`(intable, lapply(dimnames(intable), function(x) { ifelse(is.na(x), "<NA>", x) }))) } 中的NA值替换为字符表示形式,然后将其转换为dimnames data.frame

as.data.frame.matrix

答案 2 :(得分:0)

如果您对矩阵感到满意,可以通过将对象的类设置为base来在'matrix' R中执行此操作:

t1  <- with(mtcars, table(gear, cyl, exclude = NULL))
class(t1) <- 'matrix'

t1
#       cyl
# gear   4 6  8 <NA>
#   3    1 2 12    0
#   4    8 4  0    0
#   5    2 1  2    0
#   <NA> 0 0  0    0  

str(t1)
#  int [1:4, 1:4] 1 8 2 0 2 4 1 0 12 0 ...
#  - attr(*, "dimnames")=List of 2
#   ..$ gear: chr [1:4] "3" "4" "5" NA
#   ..$ cyl : chr [1:4] "4" "6" "8" NA