Long Pivot для нескольких переменных, используя Pivot long - PullRequest
1 голос
/ 01 ноября 2019

Я пытаюсь преобразовать данные широких таблиц в длинные, используя Pivot_longer из Tidyr. Однако, не удалось достичь результата - попытался выполнить поиск, но не смог найти точный сценарий.

Пример:

    x<- read.table(header=T, text='
   Dt1 V1_cur V2_cur V1_count V2_count  Other_1 
     A   10    6     50     10      Abc
     A   12    5     70     11      Xyz
     B   20    7     20     8       Axy
     B   22    8     22     9       Ax
   ')

# The result which I am trying to get is, to have one Character column with values Category-> values (V1,V2) and two measure columns Cur, Count.

# Dt1 Other_1 Category Cur Count
# A   Abc     V1       10   50
# A   Xyz     V1       12   70
# A   Abc     V2       6    10
# A   Xyz     V2       5    11
# B   Abc     V1       20   20
# B   Xyz     V1       22   22
# B   Abc     V2       7    8
# B   Xyz     V2       8    9

Я также пытался использовать Reshape / Gather, но это вызываетдругие вопросы. Однако, если бы кто-то мог сообщить мне, возможно ли достичь вышеуказанного результата, используя метод Tidyr Pivot Longer. Спасибо!

Используемый код:

pivot_longer(x,cols=c("V1_cur","V2_cur","V1_count","V2_count"),names_to=c("Category"),values_to=c("Cur","Count"))

Я не могу понять, как правильно их разделить.

Ответы [ 3 ]

2 голосов
/ 02 ноября 2019

Может быть проще, если вы измените имена переменных:

x <- x %>% 
  rename(cur_V1 = V1_cur, 
         cur_V2 = V2_cur, 
         count_V1 = V1_count,
         count_V2 = V2_count)

Тогда вы можете использовать pivot_longer, например:

x %>% 
  pivot_longer(-c(Dt1, Other_1),
               names_to = c(".value", "Category"), 
               names_sep = "_")
# A tibble: 8 x 5
  Dt1   Other_1 Category   cur count
  <fct> <fct>   <chr>    <int> <int>
1 A     Abc     V1          10    50
2 A     Abc     V2           6    10
3 A     Xyz     V1          12    70
4 A     Xyz     V2           5    11
5 B     Axy     V1          20    20
6 B     Axy     V2           7     8
7 B     Ax      V1          22    22
8 B     Ax      V2           8     9
2 голосов
/ 01 ноября 2019

вы можете использовать reshape из базы R:

reshape(x, matrix(2:5,2,byrow = T),dir="long",
          idvar = c("Dt1","Other_1"),times =c("v1","v2"),v.name=c("cur","count"))
         Dt1 Other_1 time cur count
A.Abc.v1   A     Abc   v1  10    50
A.Xyz.v1   A     Xyz   v1  12    70
B.Axy.v1   B     Axy   v1  20    20
B.Ax.v1    B      Ax   v1  22    22
A.Abc.v2   A     Abc   v2   6    10
A.Xyz.v2   A     Xyz   v2   5    11
B.Axy.v2   B     Axy   v2   7     8
B.Ax.v2    B      Ax   v2   8     9
1 голос
/ 01 ноября 2019

Для использования tidyr вам нужны отдельные шаги, насколько я вижу

x %>%
  pivot_longer(c(-Dt1, -Other_1)) %>%
  separate(name, "_", into = c("Category", "measure")) %>%
  spread(measure, value)
...