【问题标题】:Data, from wide to long数据,从宽到长
【发布时间】:2019-09-16 16:09:11
【问题描述】:

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

【问题讨论】:

标签: r


【解决方案1】:

我们可以使用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

【讨论】:

  • 我应该如何解释names_pattern中的字符?我可以在某处读到这个吗?找不到任何关于它的东西
  • @raquel 这是一个正则表达式。 (.*\\d+) 正在捕获字符 (.*) 以及一个或多个数字 (\\d+) 作为一个组 ((..)),然后是非数字 (\\D+) 作为另一组组 i。 .e q1a 将被拆分为 (q1)(a)
【解决方案2】:
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

【讨论】:

    猜你喜欢
    • 2019-03-03
    • 2015-05-22
    • 2017-10-07
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    • 2017-11-04
    相关资源
    最近更新 更多