Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有子组联接的dplyr_R_Dplyr_Reshape2_Magrittr - Fatal编程技术网

具有子组联接的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中的一种有效,并且不需要处理柱。无需
左侧的
连接