使用dplyr和tidyr并行合并两种类型的列

使用dplyr和tidyr并行合并两种类型的列,r,dplyr,R,Dplyr,我正在尝试将一些代码从plyr移植到dplyr 在一个特定的例子中,我得到了两种我想要分组的列:nameX和propX(参见下面的示例数据框foo),以及一个id列。使用ddply得到的结果给了我一个只有3列的数据框,id,name和prop(请参见下面的数据框bar) 你在正确的轨道上。关键是这里有两件事要考虑:首先,你需要定义哪些“名称”和“支柱”列在一起。其次,必须将所有不同的列名转换为两个不同的名称 grps <- c("name1" = "g1", "prop1

我正在尝试将一些代码从
plyr
移植到
dplyr

在一个特定的例子中,我得到了两种我想要分组的列:
nameX
propX
(参见下面的示例数据框
foo
),以及一个
id
列。使用
ddply
得到的结果给了我一个只有3列的数据框,
id
name
prop
(请参见下面的数据框
bar


你在正确的轨道上。关键是这里有两件事要考虑:首先,你需要定义哪些“名称”和“支柱”列在一起。其次,必须将所有不同的列名转换为两个不同的名称

grps <- c("name1" = "g1",
         "prop1" = "g1",
         "name2" = "g2",
         "prop2" = "g2",
         "name1.1" = "g3",
         "prop2.1" = "g3")


foo %>% 
  tbl_df %>%
  gather(varname,value,-id) %>%
  mutate(grpname = grps[varname]) %>%
  mutate(varname2 = varname %>% grepl("^name",.) %>% ifelse("name",varname),
         varname3 = varname %>% grepl("^prop",.) %>% ifelse("prop",varname2)) %>%
  select(id,grpname,varname3,value) %>%
  spread(varname3,value)

  id grpname name prop
1  A      g1  dXz   20
2  A      g2  Rpt   65
3  A      g3  YYq   15
4  B      g1  hut   30
5  B      g2  TPn   50
6  B      g3  pTm   20
7  C      g1  JpT   45
8  C      g2  Fil   25
9  C      g3  jjS   30
grps%
tbl_df%>%
聚集(varname,value,-id)%>%
突变(grpname=grps[varname])%>%
变异(varname2=varname%%>%grepl(“^name”,)%%>%ifelse(“name”,varname),
varname3=varname%>%grepl(“^prop”,)%>%ifelse(“prop”,varname2))%>%
选择(id、grpname、varname3、值)%>%
排列(varname3,值)
id grpname名称属性
1 A g1 dXz 20
2 A g2 Rpt 65
3 A g3 YYq 15
4 B g1小屋30
5 B g2 TPn 50
6 B g3 pTm 20
7 C g1 JpT 45
8 C g2 Fil 25
9 C g3 jjS 30

如果使用separate:
foo%%>%gather(varname,value,-id)%%>%separate(varname,c(“var”,“num”),4)%%>%spread(var,value,convert=TRUE)
Nice!如果变量名不同(例如,
name1
proportion1
),我们可以使用
separate(varname,c(“var”,“num”),-1)
,对吗?@hadley:以@AndrewMacDonald的评论为基础,在处理变量名完全不同的情况时,最优雅的方法是什么?或者,如果要拆分两个以上的名称(例如
name1
proportion1
myclass1
,等等),那么最优雅的方法是什么呢?@Pierre后一种情况非常简单——您只需要得到更多级别的
var
列。如果你不能指望数字只有一个位数(例如,
name1
name21
)。那么,提取数值可能会有所帮助
foo %>% 
  gather(name, prop, -id)
grps <- c("name1" = "g1",
         "prop1" = "g1",
         "name2" = "g2",
         "prop2" = "g2",
         "name1.1" = "g3",
         "prop2.1" = "g3")


foo %>% 
  tbl_df %>%
  gather(varname,value,-id) %>%
  mutate(grpname = grps[varname]) %>%
  mutate(varname2 = varname %>% grepl("^name",.) %>% ifelse("name",varname),
         varname3 = varname %>% grepl("^prop",.) %>% ifelse("prop",varname2)) %>%
  select(id,grpname,varname3,value) %>%
  spread(varname3,value)

  id grpname name prop
1  A      g1  dXz   20
2  A      g2  Rpt   65
3  A      g3  YYq   15
4  B      g1  hut   30
5  B      g2  TPn   50
6  B      g3  pTm   20
7  C      g1  JpT   45
8  C      g2  Fil   25
9  C      g3  jjS   30