这个数据框,

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/

10-13 06:24