【问题标题】:reshape from base vs dcast from reshape2 with missing values从 base 重塑与来自 reshape2 的 dcast 与缺失值
【发布时间】:2016-04-25 23:07:14
【问题描述】:

这个数据框,

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 函数和来自 reshape2dcast 函数相同。

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 如何处理缺失值并不明显。
  • 但是非NA-value 2 去哪儿了?
  • 这就是重点。我想知道它的去向!
  • 我不知道这是否是一个错误,但如果你将sex 中的 NA 替换为任何其他值,例如0,它会给出 2 行。
  • 在代码中它使用missing(idvar) &amp;&amp;.. 可能是一个错误,但至少你得到了dcast 的输出,这也不是很混乱。

标签: r reshape missing-data reshape2


【解决方案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 视为识别变量:-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多