用R中的几个列中的一个大列

时间:2018-06-13 08:40:48

标签: r multiple-columns tidyr tidyverse

我的数据帧有点不合适。我有几个值应该是表格格式的一列的一部分,如下所示:

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 :(得分:2)

不需要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

答案 1 :(得分:2)

[编辑]我还没有看到@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