我尝试将一些代码从plyr
移植到dplyr
。
在特定情况下,我想要将两种列组合在一起:nameX
和propX
(请参阅下面的示例数据框foo
)以及{{1} }列。我使用id
得到的结果为我提供了一个只有3列的数据框,ddply
,id
和name
(请参阅下面的数据框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
答案 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