【问题标题】:Using melt with data.table only works with multiple measure variables将 melt 与 data.table 一起使用仅适用于多个度量变量
【发布时间】:2021-09-27 19:06:38
【问题描述】:

我对@9​​87654322@ 的行为感到困惑。

我想将 data.table 从宽改成长,similar to this question

这是我的数据表:

dt <- data.table(id=c(1,2,3), varA1=c(2,6,1), varA2=c(1,1,1),varA3=c(1,2,3),  
                              varB1=c(1,0,1), varB2=c(1,1,1),varB3=c(0,0,0))

这就是我想要的:

  id index varA
1:  1     1    2
2:  2     1    6
3:  3     1    1 
4:  1     2    1
5:  2     2    1
6:  3     2    1
7:  1     3    1
8:  2     3    2
9:  3     3    3

如果我同时包含 varAvarB 作为我的度量变量,它可以正常工作,使用:

dt_long &lt;- melt(dt, id.vars = "id", measure=patterns("^varA","^varB"), value.name = c("varA","varB"),variable.name = "index")

输出如预期:

   id index varA varB
1:  1     1    2    1
2:  2     1    6    0
3:  3     1    1    1
4:  1     2    1    1
5:  2     2    1    1
6:  3     2    1    1
7:  1     3    1    0
8:  2     3    2    0
9:  3     3    3    0

但是,我只想要varA。只有一个测量变量,它不再起作用。使用

dt_long &lt;- melt(dt, id.vars ="id", measure=patterns("^varA"), value.name = "varA",variable.name = "index")

我明白了:

   id index varA
1:  1 varA1    2
2:  2 varA1    6
3:  3 varA1    1
4:  1 varA2    1
5:  2 varA2    1
6:  3 varA2    1
7:  1 varA3    1
8:  2 varA3    2
9:  3 varA3    3

为什么这里的index 变量没有像以前一样列出1、2、3?

【问题讨论】:

  • 查看 Ronak 在下方的评论,如果您同意,请编辑您的问题,然后我们可以重新打开它。

标签: r data.table reshape melt


【解决方案1】:

melt measure.vars 中使用多列是很棘手的。

来自melt关于measure.vars的帮助:

多个模式将产生多个列

如果我们将data.table:::patterns 源代码应用到dt"^varA","^varB",我们得到:

cols <- colnames(dt)
p = unlist(list("^varA","^varB"), use.names = any(nzchar(list("^varA","^varB"))))
lapply(p, grep, cols)

[[1]]
[1] 2 3 4

[[2]]
[1] 5 6 7

导致:

  • VarA1VarB1 关联,因子索引 = 1
  • VarA2VarB2 关联,因子索引 = 2
  • VarA3VarB3 关联,因子索引 = 3

请注意,索引号与 VarXi 索引无关,它只是 VarAi-VarBi 因子的自动编号。

例如,如果我们删除VarA1,我们会得到以下结果:

   id index varA varB
1:  1     1    1    1
2:  2     1    1    0
3:  3     1    1    1
4:  1     2    1    1
5:  2     2    2    1
6:  3     2    3    1
7:  1     3   NA    0
8:  2     3   NA    0
9:  3     3   NA    0
  • VarA2VarB1 关联,因子索引 = 1
  • VarA3VarB2 关联,因子索引 = 2
  • VarB3 单独,因子指数 = 3

在这两种情况下,由于该因子是一个复合因子,data.table 返回其numeric 索引。

当你只使用一个pattern时,你直接得到一个levels对应这个pattern的因子:

dt_long <- melt(dt, id.vars = "id", measure=patterns("^varA"), value.name = c("varA"),variable.name = "index")[]
dt_long$index
[1] varA1 varA1 varA1 varA2 varA2 varA2 varA3 varA3 varA3
Levels: varA1 varA2 varA3

您可以将其转换为numeric 以获得预期的结果:

dt_long[,index :=as.numeric(index)][]
   id index varA
1:  1     1    2
2:  2     1    6
3:  3     1    1
4:  1     2    1
5:  2     2    1
6:  3     2    1
7:  1     3    1
8:  2     3    2
9:  3     3    3

【讨论】:

    猜你喜欢
    • 2021-05-02
    • 2022-07-13
    • 2021-01-09
    • 2018-09-02
    • 2023-03-29
    • 2016-05-10
    • 1970-01-01
    • 2020-07-16
    相关资源
    最近更新 更多