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

时间:2014-06-20 07:06:10

标签: r dplyr

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

在特定情况下,我想要将两种列组合在一起:nameXpropX(请参阅下面的示例数据框foo)以及{{1} }列。我使用id得到的结果为我提供了一个只有3列的数据框,ddplyidname(请参阅下面的数据框prop)。< / p>

bar

我一直在尝试使用library(plyr) foo <- rbind( data.frame( id = 'A', name1 = "dXz", prop1 = 20, name2 = "Rpt", prop2 = 65, name3 = "YYq", prop3 = 15 ), data.frame( id = 'B', name1 = "hut", prop1 = 30, name2 = "TPn", prop2 = 50, name3 = "pTm", prop3 = 20 ), data.frame( id = 'C', name1 = "JpT", prop1 = 45, name2 = "Fil", prop2 = 25, name3 = "jjS", prop3 = 30 ) ) bar <- ddply( foo, .(id), function(x) { data.frame( id = as.character(x$id), name = c(as.character(x$name1), as.character(x$name2),as.character(x$name3),as.character(x$name4),as.character(x$name5)), prop = c(x$prop1,x$prop2,x$prop3,x$prop4,x$prop5) ) } ) dplyr提供的最新运算符,但我似乎无法进行两次并行分组操作。

tidyr

1 个答案:

答案 0 :(得分:2)

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

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