数据,从宽到长

时间:2019-09-16 16:09:11

标签: r

我有宽格式的数据,我想要长格式的数据。我还想基于列(a / b / c)中的值添加一个新列。感谢您提供指导以实现这一目标!

id <- 1001:1003
q1a <- c(2,3,2)
q1b <- c(7,9,6)
q1c <- c(6,2,8)
q2a <- c(2,3,7)
q2b <- c(4,5,6)
q2c <- c(6,2,8)

df <- data.frame(id,q1a,q1b,q1c, q2a, q2b, q2c)
df
    id q1a q1b q1c q2a q2b q2c
1 1001   2   7   6   2   4   6
2 1002   3   9   2   3   5   2
3 1003   2   6   8   7   6   8

     id trt q1 q2
1  1001   a  2  2
2  1001   b  7  4
3  1001   c  6  6
4  1001   a  3  3
5  1001   b  9  5
6  1001   c  2  2
7  1002   a  2  7
8  1002   b  6  6
9  1002   c  8  8
10 1002   a  2  2
11 1002   b  7  4
12 1002   c  6  6
13 1003   a  3  3

2 个答案:

答案 0 :(得分:4)

我们可以使用tidyr(版本-1.0.0

library(tidyr)  
pivot_longer(df, -id, names_to = c(".value", "trt"), names_pattern= "(.*\\d+)(\\D+)")
# A tibble: 9 x 4
#     id trt      q1    q2
#  <int> <chr> <dbl> <dbl>
#1  1001 a         2     2
#2  1001 b         7     4
#3  1001 c         6     6
#4  1002 a         3     3
#5  1002 b         9     5
#6  1002 c         2     2
#7  1003 a         2     7
#8  1003 b         6     6
#9  1003 c         8     8

答案 1 :(得分:1)

library(dplyr)
library(tidyr)
df %>%
    gather(var, val, -id) %>%
    mutate(trt = substring(var, nchar(var), nchar(var)),
           var = substring(var, 1, 2)) %>%
    spread(var, val)
#    id trt q1 q2
#1 1001   a  2  2
#2 1001   b  7  4
#3 1001   c  6  6
#4 1002   a  3  3
#5 1002   b  9  5
#6 1002   c  2  2
#7 1003   a  2  7
#8 1003   b  6  6
#9 1003   c  8  8