r - 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)使用正则表达式或排序变量将列重新排序为所需的顺序?tidyverse 风格的解决方案将是首选,但也欢迎其他方法。
解决方案
您可以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
推荐阅读
- asp.net - 如何在 Aspx 页面中使用 C# 代码在 Input 元素中添加值?
- python-3.x - Selenium 隐式和显式等待不起作用/没有效果
- python - 从数据库列创建行
- python-3.x - python 3.7中的拆分函数和整数
- vba - 添加重复工作表名称时出现 combobox1_keydown 错误
- reactjs - 找不到模块:无法解析 'F:\React\react-complete-guide\src\Component' 中的 '../axios'
- php - 如何在 Laravel 5.6 中将数据库记录下载为 Execl 文件
- java - 如何在 Java 中使用 NumberFormat 指定小数位数?
- azure - Azure AKS - 更改位置/区域?
- azure - 如何为基于 Windows Server smalldisk 的 VMSS 或 Service Fabric 群集扩展 OS 磁盘?