dplyr与子组连接

时间:2014-12-11 09:03:35

标签: r dplyr reshape2 magrittr

以下问题可以看作是"两列重塑到广泛",并且有几种方法可以用经典方式解决它,从base::reshape(恐怖)到{{ 1}}。对于两组案例,一个简单的子组连接效果最好。

我可以在reshape2的管道框架内重新构建联接吗?下面的例子有点傻,但我需要加入一个更长的管道链,我不想打破它。

dplyr

2 个答案:

答案 0 :(得分:5)

怎么样

d %>% 
  filter(treatment == "a") %>%
  left_join(., filter(d, treatment == "b"), by = "subject")

#  subject treatment.x       bp.x treatment.y      bp.y
#1       1           a  0.4392647           b 0.6741559
#2       2           a -0.6010311           b 1.9845774
#3       3           a  0.1749082           b 1.7678771
#4       4           a -0.3089731           b 0.4427471
#5       5           a -0.8346091           b 1.7156319

您可以在左连接后立即继续管道。

或者,如果您不需要单独的治疗栏,您可以使用tidyr来执行:

library(tidyr)
d %>% spread(treatment, bp)
#  subject          a         b
#1       1  0.4392647 0.6741559
#2       2 -0.6010311 1.9845774
#3       3  0.1749082 1.7678771
#4       4 -0.3089731 0.4427471
#5       5 -0.8346091 1.7156319

(与使用d %>% dcast(subject ~ treatment, value.var = "bp")包中的reshape2相同,正如Henrik在评论中所述)

答案 1 :(得分:2)

使用group_by而不是join进行解决方案。

d %>% 
group_by(subject) %>% 
summarize(bp_a = bp[match("a",treatment)], 
          bp_b = bp[match("b",treatment)])