2014-10-22 51 views
1

將缺少值的錶轉換爲與原始表具有相同結構的數據框?將具有缺失值的錶轉換爲與原始表具有相同結構的數據框?

下列方法既不工作,因爲它們要麼改變結構或不具有缺失值的工作:

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) 

對此的解決方案,因此問題並不缺少值的工作: How to convert a table to a data frame

也許我太懶惰了。 :/

回答

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 
0

如果你滿意的一個矩陣,可以通過對象的類型設置爲'matrix'base 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 
1

的問題是,您在看到NA 「t1」的結果實際上是dimnames中的一個NA值,所以不能直接使用as.data.frame.matrix

我想,如果你這樣做了很多,想節省打字,最好求助於可能會寫這樣一個函數如下:

dimFixDF <- function(intable) { 
    as.data.frame.matrix(`dimnames<-`(intable, lapply(dimnames(intable), 
    function(x) { 
     ifelse(is.na(x), "<NA>", x) 
    }))) 
} 

當你使用它,它在替換NAdimnames與字符表示,然後它將其轉換爲data.frameas.data.frame.matrix

dimFixDF(t1) 
#  4 6 8 <NA> 
# 3 1 2 12 0 
# 4 8 4 0 0 
# 5 2 1 2 0 
# <NA> 0 0 0 0 
相關問題