将缺少值的表格转换为与原始表格结构相同的数据框架?
以下两种方法都不起作用,因为它们要么更改结构,要么不使用缺失值:
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
也许我太懒了。 :/
答案 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