r - 在不同键下的 R 中的多重聚集
问题描述
我有一个如下数据集:
id v1a v2a v3a v1b v2b v3b v1c v2c v3c
1 10 11 12 20 21 22 30 31 32
2 11 12 13 21 22 23 31 32 33
3 15 16 17 25 26 27 35 36 37
我知道我可以很容易地将收集用于一组列,例如
gather(df,index,Avar,v1a:v2a,factor_key=TRUE)
这将把我的数据变成
id index Avar v1b v2b v3b v1c v2c v3c
1 v1a 10 20 21 22 30 31 32
1 v2a 11 20 21 22 30 31 32
1 v3a 12 20 21 22 30 31 32
2 v1a 11 21 22 23 31 32 33
2 v2a 12 21 22 23 31 32 33
2 v3a 13 21 22 23 31 32 33
...
我想使用 tidyverse 创建具有各自收集列的三个索引,以便结构看起来像
id index1 Avar index2 Bvar index3 Cvar
1 v1a 10 v1b 20 v1c 30
1 v1b 11 v2b 21 v2c 31
1 v1c 12 v3b 22 v3c 32
2 v1a 11 v1b 21 v1c 31
2 v1b 12 v2b 22 v2c 32
2 v1c 13 v3b 23 v3c 33
...
到目前为止,我已经尝试对收集语句进行子集化,例如
df1=gather(df,index1,Avar,v1a:v2a,factor_key=TRUE) %>%
gather(df,index2,Bvar,v1b:v2b,factor_key=TRUE) %>%
gather(df,index3,Cvar,v1c:v2c,factor_key=TRUE)
但是在我开始之前失败了,因为我得到了一个错误
Error in .f(.x[[i]],...) : object 'index2' not found
尝试了一些搜索,但似乎找不到可能使用多重收集的解决方案。感谢任何见解。
解决方案
library(tidyr) #tidyr 1.0.0'
#(v\\d)(\\D) means v and one digit in one group and a none digit in the 2nd group
pivot_longer(df, cols=v1a:v3c, names_to = c('index','.value'), names_pattern = "(v\\d)(\\D)")
# A tibble: 9 x 5
id index a b c
<int> <chr> <int> <int> <int>
1 1 v1 10 20 30
2 1 v2 11 21 31
3 1 v3 12 22 32
4 2 v1 11 21 31
5 2 v2 12 22 32
6 2 v3 13 23 33
7 3 v1 15 25 35
8 3 v2 16 26 36
9 3 v3 17 27 37
推荐阅读
- php - 如果字符在单词之前的任何位置,则正则表达式将失败,但如果在之后则通过
- spring - 我在 spring jpa 列中出现错误 Part_Category not found 异常可以帮助我吗
- ansible - Ansible 的屏幕命令
- c# - 更改具有 TwoWay 绑定的控制属性
- acumatica - 无法在 Acumatica 中发布单个自定义包
- sql-server - Perl DBI / FreeTDS / SQL-Server:如何插入/更新 BLOB varbinary(max) 数据?
- c++ - 将 c 转换为 legv8 时遇到问题
- powershell - 如何检查特定 OU 的用户权限?
- .net - 抛出异常使用流利的api从组中获取项目
- python - Python会员柜台