2016-01-20 51 views
3

WHIS此數據幀,重塑與缺失值

df <- expand.grid(id="01", parameter=c("blood", "saliva"), visit=c("V1", "V2", "V3")) 
df$value <- c(1:6) 
df$sex <- rep("f", 6) 
df 

> df 
    id parameter visit value sex 
1 01  blood V1  1 f 
2 01 saliva V1  2 f 
3 01  blood V2  3 f 
4 01 saliva V2  4 f 
5 01  blood V3  5 f 
6 01 saliva V3  6 f 

當我在「寬」格式重塑它,我得到與兩個基reshape功能和dcast函數相同的結果來自reshape2

reshape(df, 
     timevar="visit", 
     idvar=c("id", "parameter", "sex"), 
     direction="wide") 

    id parameter sex value.V1 value.V2 value.V3 
1 01  blood f  1  3  5 
2 01 saliva f  2  4  6 


library(reshape2) 
dcast(df, 
     id+parameter+sex~visit, 
     value.var="value") 

    id parameter sex V1 V2 V3 
1 01  blood f 1 3 5 
2 01 saliva f 2 4 6 

但如果我增加一些缺失值,結果不同

df$value <- c(1,2,NA,NA,NA,NA) 
df$sex <- c(NA,NA,NA,NA,NA,NA) 
df 

> df 
    id parameter visit value sex 
1 01  blood V1  1 NA 
2 01 saliva V1  2 NA 
3 01  blood V2 NA NA 
4 01 saliva V2 NA NA 
5 01  blood V3 NA NA 
6 01 saliva V3 NA NA 

含底座reshape,我只得到一個行

reshape(df, 
     timevar="visit", 
     idvar=c("id", "parameter", "sex"), 
     direction="wide") 

    id parameter sex value.V1 value.V2 value.V3 
1 01  blood NA  1  NA  NA 

隨着dcast,我得到兩排

dcast(df, 
     id+parameter+sex~visit, 
     value.var="value") 

    id parameter sex V1 V2 V3 
1 01  blood NA 1 NA NA 
2 01 saliva NA 2 NA NA 

有沒有辦法來處理基地reshape函數中的這些缺失值,因爲我想用這個?

+1

從幫助頁面進行處理,這不是顯而易見的是如何'reshape'處理丟失的值。 – akrun

+1

但是,非'NA'值'2'在哪裏? – jogo

+0

這就是要點。我想知道它在哪裏! – user3631369

回答

1

reshape代碼的相關部分將是行:

data[, tempidname] <- interaction(data[, idvar], drop = TRUE) 

看看如何interaction作品:

> interaction("A", "B") 
[1] A.B 
Levels: A.B 
> interaction("A", "B", NA) 
[1] <NA> 
Levels: 

但是,比較,如果NA被保留爲level會發生什麼:

> interaction("A", "B", addNA(NA)) 
[1] A.B.NA 
Levels: A.B.NA 

因此,如果您想要與基準R的reshape具有相同的結果,則需要確保任何「idvar」列都保留爲級別NA

實施例:

df$sex <- addNA(df$sex) 
reshape(df, 
     timevar="visit", 
     idvar=c("id", "parameter", "sex"), 
     direction="wide") 
# id parameter sex value.V1 value.V2 value.V3 
# 1 01  blood <NA>  1  NA  NA 
# 2 01 saliva <NA>  2  NA  NA 

當然,其他的問題是如何NA能夠作爲識別變量:-)