R dplyr-按名称模式重新排列列

芳基

我有一些长格式的数据,其中1)需要调整为较宽的宽度,然后2)需要根据其名称的样式对列进行排序。示例数据如下:

#Orignial data
set.seed(100)
long_df <- tibble(id = rep(1:5, each = 3),
                  group = rep(c('g1','g2','g3'), times = 5),
                  mean = runif(15, min = 1, max = 10),
                  sd = runif(15, min = .025, max = 1))
long_df

# A tibble: 15 x 4
      id group  mean    sd
   <int> <chr> <dbl> <dbl>
 1     1 g1     3.77 0.677
 2     1 g2     3.32 0.224
 3     1 g3     5.97 0.374
 4     2 g1     1.51 0.375
 5     2 g2     5.22 0.698
 6     2 g3     5.35 0.547
 7     3 g1     8.31 0.718
 8     3 g2     4.33 0.550
 9     3 g3     5.92 0.755
10     4 g1     2.53 0.435
11     4 g2     6.62 0.192
12     4 g3     8.94 0.776
13     5 g1     3.52 0.885
14     5 g2     4.59 0.560
15     5 g3     7.86 0.296

#Reshaped to wide
wide_df <- long_df %>% 
  pivot_wider(id_cols = id, names_from = 'group', values_from = c('mean','sd'))
wide_df

# A tibble: 5 x 7
     id mean_g1 mean_g2 mean_g3 sd_g1 sd_g2 sd_g3
  <int>   <dbl>   <dbl>   <dbl> <dbl> <dbl> <dbl>
1     1    3.77    3.32    5.97 0.677 0.224 0.374
2     2    1.51    5.22    5.35 0.375 0.698 0.547
3     3    8.31    4.33    5.92 0.718 0.550 0.755
4     4    2.53    6.62    8.94 0.435 0.192 0.776
5     5    3.52    4.59    7.86 0.885 0.560 0.296

#Wide with proper column order
final_df <- wide_df %>% 
  select(id, mean_g1, sd_g1, mean_g2, sd_g2, mean_g3, sd_g3)
final_df

# A tibble: 5 x 7
     id mean_g1 sd_g1 mean_g2 sd_g2 mean_g3 sd_g3
  <int>   <dbl> <dbl>   <dbl> <dbl>   <dbl> <dbl>
1     1    3.77 0.677    3.32 0.224    5.97 0.374
2     2    1.51 0.375    5.22 0.698    5.35 0.547
3     3    8.31 0.718    4.33 0.550    5.92 0.755
4     4    2.53 0.435    6.62 0.192    8.94 0.776
5     5    3.52 0.885    4.59 0.560    7.86 0.296

有人知道一种方法吗?a)旋转长数据并按正确的顺序输出b)b)使用正则表达式或排序变量将列重新排序为所需顺序?最好使用tidyverse样式的解决方案,但也欢迎使用其他方法。

eipi10

您可以ends_with在具有数字后缀的字符向量上连续运行

long_df %>% 
  pivot_wider(names_from=group, values_from=c(mean, sd)) %>% 
  select(id, ends_with(as.character(1:3)))
     id mean_g1 sd_g1 mean_g2 sd_g2 mean_g3 sd_g3
  <int>   <dbl> <dbl>   <dbl> <dbl>   <dbl> <dbl>
1     1    3.77 0.677    3.32 0.224    5.97 0.374
2     2    1.51 0.375    5.22 0.698    5.35 0.547
3     3    8.31 0.718    4.33 0.550    5.92 0.755
4     4    2.53 0.435    6.62 0.192    8.94 0.776
5     5    3.52 0.885    4.59 0.560    7.86 0.296

这可能需要开发版本dplyr才能工作(devtools::install_github("tidyverse/dplyr"))。我正在运行开发版本,并且没有在当前的CRAN版本中检查此代码。

您也可以pivot_longer使用数据框的“最长”版本,然后pivot_wider无需采取任何措施即可获得所需的列顺序:

long_df %>% 
  pivot_longer(cols=c(mean, sd)) %>% 
  pivot_wider(names_from=c(name, group), values_from=value)
     id mean_g1 sd_g1 mean_g2 sd_g2 mean_g3 sd_g3
  <int>   <dbl> <dbl>   <dbl> <dbl>   <dbl> <dbl>
1     1    3.77 0.677    3.32 0.224    5.97 0.374
2     2    1.51 0.375    5.22 0.698    5.35 0.547
3     3    8.31 0.718    4.33 0.550    5.92 0.755
4     4    2.53 0.435    6.62 0.192    8.94 0.776
5     5    3.52 0.885    4.59 0.560    7.86 0.296

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

用r中的特定跳过模式重新排列向量

来自分类Dev

R重新排列数据

来自分类Dev

R:根据排名重新排列数据框的列

来自分类Dev

R Studio-分组后重新排列列

来自分类Dev

R:以扩展方式重新排列数据框中的列

来自分类Dev

R-按两列将数据框中的数据分组,然后重新排列为新数据框

来自分类常见问题

R dplyr:删除多列

来自分类Dev

使用R / dplyr过滤列?

来自分类Dev

在R中重新排列分组数据

来自分类Dev

重新排列R中的Matrix行

来自分类Dev

R数据帧重新排列

来自分类Dev

在R中重新排列数据帧

来自分类Dev

R:如何重新排列列表对象

来自分类Dev

R重新排列数据框尺寸

来自分类Dev

重新排列R中的Matrix行

来自分类Dev

R dplyr链接按功能分组

来自分类Dev

R:dplyr按日期范围分组

来自分类Dev

R和dplyr:按值范围分组

来自分类Dev

R dplyr链接按功能分组

来自分类Dev

R:按多列分组后的 Dplyr 滞后变量

来自分类Dev

重新排列两列,以使第一列的值在R中始终较大

来自分类Dev

将 R 中的数据重新排列为某些列内容,而不是 2 列 1

来自分类Dev

dplyr跨r中的多个列分组?

来自分类Dev

在R中使用dplyr划分多列

来自分类Dev

在R中使用dplyr划分多列

来自分类Dev

R dplyr从表中删除“ <NA>”列

来自分类Dev

在 R 中使用 `dplyr` 识别列排名

来自分类Dev

R重新排列数据框:将某些行转换为列

来自分类Dev

R:将单列数据帧的特定行重新排列为新列