【问题标题】:Using pivot_longer in tidyr with a complex separator [duplicate]在 tidyr 中使用带有复杂分隔符的 pivot_longer [重复]
【发布时间】:2020-10-01 06:23:44
【问题描述】:

在之前的帖子here 中,我尝试使用tidyr::pivotlonger() 获得等效的rbind。这就是数据和解决方案。

set.seed(1)
df1 <- data.frame(group = rep(letters[1:2],each=3),
                 day = rep(1:3,2),
                 var1_mean = round(rnorm(6),2),
                 var1_sd = round(rnorm(6,5),2),
                 var2_mean = round(rnorm(6),2),
                 var2_sd = round(rnorm(6,5),2))


#   group day var1_mean var1_sd var2_mean var2_sd
# 1     a   1     -0.63    5.49     -0.62    5.82
# 2     a   2      0.18    5.74     -2.21    5.59
# 3     a   3     -0.84    5.58      1.12    5.92
# 4     b   1      1.60    4.69     -0.04    5.78
# 5     b   2      0.33    6.51     -0.02    5.07
# 6     b   3     -0.82    5.39      0.94    3.01


df1 %>% 
  pivot_longer(cols = starts_with('var'), 
               names_to = c('grp', '.value'),
               names_sep="_")

#     group   day grp    mean    sd
#     <fct> <int> <chr> <dbl> <dbl>
# 1   a         1 var1  -0.63  5.49
# 2   a         1 var2  -0.62  5.82
# 3   a         2 var1   0.18  5.74
# 4   a         2 var2  -2.21  5.59
# 5   a         3 var1  -0.84  5.58
# 6   a         3 var2   1.12  5.92
# 7   b         1 var1   1.6   4.69
# 8   b         1 var2  -0.04  5.78
# 9   b         2 var1   0.33  6.51
# 10  b         2 var2  -0.02  5.07
# 11  b         3 var1  -0.82  5.39
# 12  b         3 var2   0.94  3.01

这个解决方案完全取决于用于 mean 和 sd 变量的命名约定。如果有不同的命名约定,列名的两个重要节点之间有更复杂的分隔符,像这样...

df2 <- data.frame(group = rep(letters[1:2],each=3),
                  day = rep(1:3,2),
                  mean_var_1 = round(rnorm(6),2),
                  sd_var_1 = round(rnorm(6,5),2),
                  mean_var_2 = round(rnorm(6),2),
                  sd_var_2 = round(rnorm(6,5),2))

df2

#   group day mean_var_1 sd_var_1 mean_var_2 sd_var_2
# 1     a   1       0.62     6.36      -0.39     5.70
# 2     a   2      -0.06     4.90      -0.06     5.56
# 3     a   3      -0.16     5.39       1.10     4.31
# 4     b   1      -1.47     4.95       0.76     4.29
# 5     b   2      -0.48     3.62      -0.16     5.36
# 6     b   3       0.42     4.59      -0.25     5.77

如果使用单个 mean 和 sd 列并将 var_1 和 var_2 作为分组变量,我将如何获得与第一个示例类似的结果?

【问题讨论】:

    标签: r pivot tidyr


    【解决方案1】:

    如果您的名称很复杂,您可以使用names_pattern 参数,您可以在其中指定如何使用列名的每个部分来获取长格式数据。

    tidyr::pivot_longer(df2, 
                        cols = contains('var'), 
                        names_to = c('.value', 'grp'), 
                        names_pattern = '(.*?)_(.*)')
    
    #   group   day grp    mean    sd
    #   <chr> <int> <chr> <dbl> <dbl>
    # 1 a         1 var_1  0.62  6.36
    # 2 a         1 var_2 -0.39  5.7 
    # 3 a         2 var_1 -0.06  4.9 
    # 4 a         2 var_2 -0.06  5.56
    # 5 a         3 var_1 -0.16  5.39
    # 6 a         3 var_2  1.1   4.31
    # 7 b         1 var_1 -1.47  4.95
    # 8 b         1 var_2  0.76  4.29
    # 9 b         2 var_1 -0.48  3.62
    #10 b         2 var_2 -0.16  5.36
    #11 b         3 var_1  0.42  4.59
    #12 b         3 var_2 -0.25  5.77
    

    '(.*?)_(.*)' 使用两组数据,其中第一组是列名中第一个下划线 ((.*?)) 之前的所有内容,第二组是第一组 ((.*)) 之后的所有内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      • 2018-05-26
      • 1970-01-01
      • 1970-01-01
      • 2018-07-09
      相关资源
      最近更新 更多