使用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