我有宽格式的数据,我想要长格式的数据。我还想基于列(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
答案 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