具有子组联接的dplyr
下面的问题可以看作是“从两列重塑到宽”,有几种方法可以用经典的方法来解决,从具有子组联接的dplyr,r,dplyr,reshape2,magrittr,R,Dplyr,Reshape2,Magrittr,下面的问题可以看作是“从两列重塑到宽”,有几种方法可以用经典的方法来解决,从base::restrape(恐怖)到restrape2。对于两个组的情况,简单的子组联接最有效 我可以在dplyr的管道框架内重新设置连接吗?下面的例子有点傻,但我需要一个较长的管道链,我不想打破连接 library(dplyr) d = data.frame(subject= rep(1:5,each=2),treatment=letters[1:2],bp = rnorm(10)) d %>% # As
base::restrape
(恐怖)到restrape2
。对于两个组的情况,简单的子组联接最有效
我可以在dplyr
的管道框架内重新设置连接吗?下面的例子有点傻,但我需要一个较长的管道链,我不想打破连接
library(dplyr)
d = data.frame(subject= rep(1:5,each=2),treatment=letters[1:2],bp = rnorm(10))
d %>%
# Assume piped manipulations here
# Make wide
# Assume additional piped manipulations here
# Make wide (old style)
with(d,left_join(d[treatment=="a",],
d[treatment=="b",],by="subject" ))
怎么样
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
(这与使用Henrik在评论中指出的来自重塑2包的
d%>%dcast(受试者~treatment,value.var=“bp”)
解决方案相同)使用group\u by代替join
d %>%
group_by(subject) %>%
summarize(bp_a = bp[match("a",treatment)],
bp_b = bp[match("b",treatment)])
也许您可以详细说明“简单的子组连接效果最佳”部分?是什么阻止您将例如
d%>%dcast(subject~treatment,value.var=“bp”)
放入管道中?似乎左联合
需要更多的硬编码?但我可能误解了你的目标。你理解得相当好,我可能是因为过去太多的整形手术而脑部受损。我本能地害怕在你的第一个例子中重复使用d,但这可能是没有道理的。第二种解决方案和Henrik中的一种有效,并且不需要处理柱。无需左侧的
连接