使用更大的数据集中的行切换年份以垂直扩展数据帧

时间:2017-08-30 13:36:04

标签: r

我有一个如下数据集:

     ColA  ColB   1910   1911   1912   1913   1914   1915   1916   1917
 1     1     a     84     62     31     64     38     46     62     13
 2     1     b     73     31    100     36     30     93     49     10
 3     1     c     72     29     49     14     33     18     67     60
 4     1     d     53    100     41     76     65     68     35      3
 5     1     e     63     20      2     59     56     68     26     49
 6     2     a     98     98     41      9     31     36     19     47
 7     2     b     63     54     12     15     85     98     70     17
 8     2     c     54     68     73      6      7     12     52     73
 9     2     d     42     97     22     92     63     96     72      8
10     2     e     10     69     21     84     31     75     65     56
11     3     a     93     36     47     95      2     45     34     85
12     3     b     52     10     52     96     48     39     89     46
13     3     c     47     82     58     58     76     43      4     57
14     3     d     91     40     59     77     68     23     78      6
15     3     e     70     16     60     84     13    100     29     29

我需要帮助用列B切换年份,但是我想在R中垂直扩展数据帧,而不是重复列。

我知道很多问题都很相似,但我无法让这个过程发挥作用。

非常感谢任何帮助或指导

1 个答案:

答案 0 :(得分:0)

我们可以使用dplyrtidyr进行转换。 gather可以将数据帧从宽格式转换为长格式。使用-ColA-ColB指定转化过程不包括ColAColB。相比之下,spread将长格式转换为宽格式。 rename是更改列名称的函数。 dt2是最终输出。

library(dplyr)
library(tidyr)

dt2 <- dt %>%
  gather(Year, Value, -ColA, -ColB) %>%
  spread(ColB, Value) %>%
  rename(ColB = Year)

dt2
   ColA ColB  a   b  c   d   e
1     1 1910 84  73 72  53  63
2     1 1911 62  31 29 100  20
3     1 1912 31 100 49  41   2
4     1 1913 64  36 14  76  59
5     1 1914 38  30 33  65  56
6     1 1915 46  93 18  68  68
7     1 1916 62  49 67  35  26
8     1 1917 13  10 60   3  49
9     2 1910 98  63 54  42  10
10    2 1911 98  54 68  97  69
11    2 1912 41  12 73  22  21
12    2 1913  9  15  6  92  84
13    2 1914 31  85  7  63  31
14    2 1915 36  98 12  96  75
15    2 1916 19  70 52  72  65
16    2 1917 47  17 73   8  56
17    3 1910 93  52 47  91  70
18    3 1911 36  10 82  40  16
19    3 1912 47  52 58  59  60
20    3 1913 95  96 58  77  84
21    3 1914  2  48 76  68  13
22    3 1915 45  39 43  23 100
23    3 1916 34  89  4  78  29
24    3 1917 85  46 57   6  29

数据

dt <- read.table(text = "    ColA  ColB   1910   1911   1912   1913   1914   1915   1916   1917
 1     1     a     84     62     31     64     38     46     62     13
                 2     1     b     73     31    100     36     30     93     49     10
                 3     1     c     72     29     49     14     33     18     67     60
                 4     1     d     53    100     41     76     65     68     35      3
                 5     1     e     63     20      2     59     56     68     26     49
                 6     2     a     98     98     41      9     31     36     19     47
                 7     2     b     63     54     12     15     85     98     70     17
                 8     2     c     54     68     73      6      7     12     52     73
                 9     2     d     42     97     22     92     63     96     72      8
                 10     2     e     10     69     21     84     31     75     65     56
                 11     3     a     93     36     47     95      2     45     34     85
                 12     3     b     52     10     52     96     48     39     89     46
                 13     3     c     47     82     58     58     76     43      4     57
                 14     3     d     91     40     59     77     68     23     78      6
                 15     3     e     70     16     60     84     13    100     29     29",
                 header = TRUE, stringsAsFactors = FALSE)


colnames(dt) <- c("ColA", "ColB", as.character(1910:1917))