dplyr中的Multiple gather(),而不将长度延长一次以上

dplyr中的Multiple gather(),而不将长度延长一次以上,r,dplyr,R,Dplyr,我有一个玩具数据框。我想收集多个类别,但最终应该只有三个ID。换句话说,在id列中,我应该只有三个相同数字的重复 >a id cat.a1 cat.a2 cat.a3 cat.b1 cat.b2 cat.b3 cat.c1 cat.c2 cat.c3 1 1.0 2.0 3.0 1.0 2.0 3.0 1.0 2.0 3.0 2 1.0 2.0 3.0 1.0 2.0 3.0 1

我有一个玩具数据框。我想收集多个类别,但最终应该只有三个ID。换句话说,在id列中,我应该只有三个相同数字的重复

>a

id cat.a1  cat.a2 cat.a3 cat.b1  cat.b2 cat.b3 cat.c1  cat.c2 cat.c3 
1   1.0     2.0    3.0    1.0     2.0    3.0    1.0     2.0    3.0
2   1.0     2.0    3.0    1.0     2.0    3.0    1.0     2.0    3.0
3   1.0     2.0    3.0    1.0     2.0    3.0    1.0     2.0    3.0
上面的数据框是我的开始。从那时起,我可以做到以下几点

a %>% 
 gather(key1,cat.a,starts_with('cat.a')) %>%
 select(-starts_with('key')) %>% 
 arrange(id)
这让我

id   cat.a  cat.b1  cat.b2 cat.b3 cat.c1  cat.c2 cat.c3
1     1.0    1.0     2.0    3.0    1.0     2.0    3.0
1     2.0    1.0     2.0    3.0    1.0     2.0    3.0
1     3.0    1.0     2.0    3.0    1.0     2.0    3.0
2     1.0    1.0     2.0    3.0    1.0     2.0    3.0
2     2.0    1.0     2.0    3.0    1.0     2.0    3.0
2     3.0    1.0     2.0    3.0    1.0     2.0    3.0
3     1.0    1.0     2.0    3.0    1.0     2.0    3.0
3     2.0    1.0     2.0    3.0    1.0     2.0    3.0
3     3.0    1.0     2.0    3.0    1.0     2.0    3.0
如何更改代码以获取

id  cat.a cat.b cat.c
1    1.0   2.0   3.0
1    1.0   2.0   3.0
1    1.0   2.0   3.0
2    1.0   2.0   3.0
2    1.0   2.0   3.0
2    1.0   2.0   3.0
3    1.0   2.0   3.0
3    1.0   2.0   3.0
3    1.0   2.0   3.0
到目前为止,我已尝试进行多次采集,但正如您所料,这导致数据帧比我需要的要长得多。

这里有一种使用tidyverse的方法

tidyverse有一种方法


你能解释一下“\\d+”在做什么吗?我知道它是正则表达式,但我不确定发生了什么。它从字符串中删除数字。试试子“\\d+”,“abc12”你能解释一下“\\d+”在做什么吗?我知道它是正则表达式,但我不确定发生了什么。它从字符串中删除数字。尝试子“\\d+”、“abc12”
library(tidyverse)
df %>% 
  gather(var, val, starts_with('cat')) %>% 
  group_by(var = sub('\\d+', '', var)) %>% 
  mutate(new = seq(n())) %>% 
  spread(var, val) %>% 
  select(-new) %>% 
  ungroup()

## A tibble: 9 × 4
#     id cat.a cat.b cat.c
#* <int> <dbl> <dbl> <dbl>
#1     1     1     1     1
#2     1     2     2     2
#3     1     3     3     3
#4     2     1     1     1
#5     2     2     2     2
#6     2     3     3     3
#7     3     1     1     1
#8     3     2     2     2
#9     3     3     3     3