【问题标题】:Melt data frame with multiple identically named 'id.vars'熔化具有多个同名“id.vars”的数据框
【发布时间】:2020-02-01 02:54:33
【问题描述】:

我有一个包含多个同名列的数据框:

> df <- data.frame(X1=c(1:4),Y1=c(16:13),X2=c(4:7),Y2=c(-1:-4),X3=c(3:6),Y3=c(2:-1))
> df
  X1 Y1 X2 Y2 X3 Y3
1  1 16  4 -1  3  2
2  2 15  5 -2  4  1
3  3 14  6 -3  5  0
4  4 13  7 -4  6 -1

> names(df)[c(1,3,5)] <- "X" 

我想用 id.vars='X' 融化这个数据框,但是只有第一个 'X' 列被识别。这是给我的:

> df2 <- melt(df, id.vars = 'X')
> df2
   X variable value
1  1       Y1    16
2  2       Y1    15
3  3       Y1    14
4  4       Y1    13
5  1       Y2    -1
6  2       Y2    -2
7  3       Y2    -3
8  4       Y2    -4
9  1       Y3     2
10 2       Y3     1
11 3       Y3     0
12 4       Y3    -1

我想要的输出是:

> df2
   X variable value
1  1       Y1    16
2  2       Y1    15
3  3       Y1    14
4  4       Y1    13
5  4       Y2    -1
6  5       Y2    -2
7  6       Y2    -3
8  7       Y2    -4
9  3       Y3     2
10 4       Y3     1
11 5       Y3     0
12 6       Y3    -1

【问题讨论】:

  • 拥有多个同名的列似乎是个坏主意。有什么原因必须发生这种情况,或者您可以在重塑之前解决它吗?

标签: r dataframe melt


【解决方案1】:

我们可以从data.table使用melt

library(data.table)
names(df) <- make.unique(names(df))
melt(setDT(df), measure = patterns("^X", "^Y"))

【讨论】:

    【解决方案2】:
    library(tidyverse)
    library(tidyselect)
    df %>% pivot_longer(everything(),
                        names_to = c(".value", "set"),
                        names_pattern = "(.)(.)")
    

    【讨论】:

      猜你喜欢
      • 2018-01-21
      • 2020-03-08
      • 1970-01-01
      • 2014-02-24
      • 1970-01-01
      • 2019-05-25
      • 2021-11-27
      • 2019-12-01
      • 2012-11-26
      相关资源
      最近更新 更多