Сделайте одну большую колонку из нескольких в R - PullRequest
0 голосов
/ 13 июня 2018

У меня есть датафрейм в немного неудачном формате.У меня есть несколько значений, которые должны быть частью одного столбца в табличном формате, как показано ниже:

X_1     X_2     X_3             X_4             X_5     
Wasser  Strand  Zangen          Beine           Schmerz 
Wasser  Meer    rot             Steine          beißen  
Rot     Lecker  Restaurant      Teuer           Gourmet 
Zellen  Leid    Schmerzen       Chemotherapie   Tot 
rot     Krallen tödlich         Schmerzen       schlimm 
Hummer  salz    sternzeichen    krankheit       rot 
Wasser  Meer    Sternzeichen    Krankheit       Tumor

Я бы хотел, чтобы мой фрейм данных выглядел «аккуратно», поэтому я бы хотел сложить несколько столбцовв один столбец, например:

X_1
Wasser
Wasser
Rot
Zellen
rot
Hummer
Wasser
Strand
Meer
Lecker
Leid
Krallen
....

И это нужно сделать для нескольких «блоков».Есть ли способ сделать это в рамках tidyverse?Я попытался возиться с gather(), но не смог заставить его работать ...

Чтобы предоставить небольшой фрагмент кода, можно привести воспроизводимый пример из этого:

matrix(1:40, ncol = 8)

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    6   11   16   21   26   31   36
[2,]    2    7   12   17   22   27   32   37
[3,]    3    8   13   18   23   28   33   38
[4,]    4    9   14   19   24   29   34   39
[5,]    5   10   15   20   25   30   35   40

И результат, который я хотел бы получить, выглядел бы так:

      [,1] [,2]
 [1,]    1   21
 [2,]    2   22
 [3,]    3   23
 [4,]    4   24
 [5,]    5   25
 [6,]    6   26
 [7,]    7   27
 [8,]    8   28
 [9,]    9   29
[10,]   10   30
[11,]   11   31
[12,]   12   32
[13,]   13   33
[14,]   14   34
[15,]   15   35
[16,]   16   36
[17,]   17   37
[18,]   18   38
[19,]   19   39
[20,]   20   40

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

[ПРАВИТЬ] Я не видел ответа от @Wimpel.Так что с data.frame и более сложным шаблоном я вижу следующее решение:

> df <- as.data.frame(matrix(1:40, ncol = 8))
> df
  V1 V2 V3 V4 V5 V6 V7 V8
1  1  6 11 16 21 26 31 36
2  2  7 12 17 22 27 32 37
3  3  8 13 18 23 28 33 38
4  4  9 14 19 24 29 34 39
5  5 10 15 20 25 30 35 40
> pattern = list(c(1,3), c(2, 5), c(4, 7), c(6, 8))
> data.frame(sapply(pattern, function(x) unlist(df[x])))
    X1 X2 X3 X4
V11  1  6 16 26
V12  2  7 17 27
V13  3  8 18 28
V14  4  9 19 29
V15  5 10 20 30
V31 11 21 31 36
V32 12 22 32 37
V33 13 23 33 38
V34 14 24 34 39
V35 15 25 35 40
0 голосов
/ 13 июня 2018

Нет необходимости в tidyverse.

Создайте новую матрицу из предыдущей .. установите количество столбцов и заполните столбцом (byrow = FALSE)

m <- matrix(1:40, ncol = 8)
matrix(m, ncol = 2, byrow = FALSE)

      [,1] [,2]
 [1,]    1   21
 [2,]    2   22
 [3,]    3   23
 [4,]    4   24
 [5,]    5   25
 [6,]    6   26
 [7,]    7   27
 [8,]    8   28
 [9,]    9   29
[10,]   10   30
[11,]   11   31
[12,]   12   32
[13,]   13   33
[14,]   14   34
[15,]   15   35
[16,]   16   36
[17,]   17   37
[18,]   18   38
[19,]   19   39
[20,]   20   40
...