这个数据框,
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
函数中处理这些缺失值,因为我想使用这个函数? 最佳答案
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
视为识别变量 :-)关于从具有缺失值的 reshape2 的 base 和 dcast 重塑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34894358/