我希望将数据帧从宽格式转换为长格式,同时保持多列。
以下是示例数据:
df <- read.table(header=T, text='
Subject Day Correct1 Correct2 Correct3 Percent1 Percent2 Percent3
1 1 1 0 1 50 25 70
2 1 1 0 0 75 30 80
3 1 0 1 1 70 45 90
4 1 0 1 0 80 50 100
5 1 1 1 1 90 60 100
1 2 0 1 0 30 75 90
2 2 0 0 1 45 70 80
3 2 1 1 0 50 30 90
4 2 1 0 0 60 45 100
5 2 1 1 1 80 45 90
')
并且希望它看起来像这样-我在“正确和百分比”列中。
Subject Day Correct CorrectValue Percent PercentValue
1 1 1 1 1 50
2 1 1 1 1 75
3 1 1 0 1 70
4 1 1 0 1 80
5 1 1 1 1 90
1 1 2 0 2 25
2 1 2 0 2 30
3 1 2 1 2 45
4 1 2 1 2 50
5 1 2 1 2 60
1 1 3 1 3 70
2 1 3 0 3 80
3 1 3 1 3 90
4 1 3 0 3 100
5 1 3 1 3 100
1 2 1 0 1 30
2 2 1 0 1 45
3 2 1 1 1 50
4 2 1 1 1 60
5 2 1 1 1 80
1 2 2 1 2 75
2 2 2 0 2 70
3 2 2 1 2 30
4 2 2 0 2 45
5 2 2 1 2 45
1 2 3 0 3 90
2 2 3 1 3 80
3 2 3 0 3 90
4 2 3 0 3 100
5 2 3 1 3 90
谢谢!
答案 0 :(得分:1)
使用gather
中的tidyr
:
library(dplyr)
library(tidyr)
df %>%
gather(Correct, CorrectValue, Correct1:Correct3) %>%
gather(Percent, PercentValue, Percent1:Percent3) %>%
mutate_at(vars(Correct, Percent), ~sub("[[:alpha:]]+", "", .))
结果:
Subject Day Correct CorrectValue Percent PercentValue
1 1 1 1 1 1 50
2 2 1 1 1 1 75
3 3 1 1 0 1 70
4 4 1 1 0 1 80
5 5 1 1 1 1 90
6 1 2 1 0 1 30
7 2 2 1 0 1 45
8 3 2 1 1 1 50
9 4 2 1 1 1 60
10 5 2 1 1 1 80
11 1 1 2 0 1 50
12 2 1 2 0 1 75
13 3 1 2 1 1 70
14 4 1 2 1 1 80
15 5 1 2 1 1 90
16 1 2 2 1 1 30
17 2 2 2 0 1 45
18 3 2 2 1 1 50
19 4 2 2 0 1 60
20 5 2 2 1 1 80
21 1 1 3 1 1 50
22 2 1 3 0 1 75
23 3 1 3 1 1 70
24 4 1 3 0 1 80
25 5 1 3 1 1 90
...