我有一个如下数据集:
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中垂直扩展数据帧,而不是重复列。
我知道很多问题都很相似,但我无法让这个过程发挥作用。
非常感谢任何帮助或指导
答案 0 :(得分:0)
我们可以使用dplyr
和tidyr
进行转换。 gather
可以将数据帧从宽格式转换为长格式。使用-ColA
和-ColB
指定转化过程不包括ColA
和ColB
。相比之下,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))