使用tidyr实现相当于rbind的功能 [英] Achieving the equivalent of rbind using tidyr

查看:23
本文介绍了使用tidyr实现相当于rbind的功能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一些类似于此的数据。

set.seed(1)
df <- 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))

df

# output

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

下面是我希望它是什么样子(以及我过去使用的代码)

library(tidyverse)
rbind(df %>% select(group, day, starts_with("var1")) %>% rename(mean = var1_mean, sd = var1_sd),
      df %>% select(group, day, starts_with("var2")) %>% rename(mean = var2_mean, sd = var2_sd)) %>%
  add_column(var = rep(paste0("var",1:2),each=6), .before = "group")

# output

#   var group day  mean   sd
#  var1     a   1 -0.63 5.49
#  var1     a   2  0.18 5.74
#  var1     a   3 -0.84 5.58
#  var1     b   1  1.60 4.69
#  var1     b   2  0.33 6.51
#  var1     b   3 -0.82 5.39
#  var2     a   1 -0.62 5.82
#  var2     a   2 -2.21 5.59
#  var2     a   3  1.12 5.92
#  var2     b   1 -0.04 5.78
#  var2     b   2 -0.02 5.07
#  var2     b   3  0.94 3.01

现在我的代码显然可以完成这项工作,但我想知道是否有什么方法可以使用pivot_longer()或其他函数来不那么笨拙地完成这项工作。

推荐答案

我们可以使用pivot_longer,其中names_sep指定为_names_to指定为".value"和分组名称

library(dplyr)
library(tidyr)
df %>% 
    pivot_longer(cols = starts_with('var'), 
       names_to = c('grp', '.value'), names_sep="_")
#   group   day grp    mean    sd
#   <chr> <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

我们可以稍后删除"GRP"列

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

这篇关于使用tidyr实现相当于rbind的功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆