Расплавить фрейм данных с несколькими идентично названными «id.vars» - PullRequest
1 голос
/ 31 января 2020

У меня есть фрейм данных с несколькими столбцами с одинаковыми именами:

> 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

Ответы [ 2 ]

4 голосов
/ 31 января 2020

Мы можем использовать melt от data.table

library(data.table)
names(df) <- make.unique(names(df))
melt(setDT(df), measure = patterns("^X", "^Y"))
0 голосов
/ 31 января 2020
library(tidyverse)
library(tidyselect)
df %>% pivot_longer(everything(),
                    names_to = c(".value", "set"),
                    names_pattern = "(.)(.)")
...