以下问题可以看作是"两列重塑到广泛",并且有几种方法可以用经典方式解决它,从base::reshape
(恐怖)到{{ 1}}。对于两组案例,一个简单的子组连接效果最好。
我可以在reshape2
的管道框架内重新构建联接吗?下面的例子有点傻,但我需要加入一个更长的管道链,我不想打破它。
dplyr
答案 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)])