dplyr中的Multiple gather(),而不将长度延长一次以上
我有一个玩具数据框。我想收集多个类别,但最终应该只有三个ID。换句话说,在id列中,我应该只有三个相同数字的重复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
>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