2016-01-20 55 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能够作为识别变量:-)