【问题标题】:dplyr with subgroup join具有子组连接的 dplyr
【发布时间】:2015-02-09 16:54:55
【问题描述】:

下面的问题可以看成是“两列reshape to wide”,有几种方法可以用经典的方式解决,从base::reshape(恐怖)到reshape2。对于两组情况,简单的子组连接效果最好。

我可以在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 %>% dcast(subject ~ treatment, value.var = "bp") 在你的管道里?似乎left_join 需要更多的硬编码?但我可能误解了你的目标。
  • 你理解得很好,我可能是因为过去太多的重塑而大脑受损。有效(就像@beginneR 的传播一样)。

标签: r dplyr reshape2 magrittr


【解决方案1】:

使用 group_by 代替 join 的解决方案。

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

【讨论】:

    【解决方案2】:

    怎么样

    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 在 cmets 中提到的 reshape2 包中的 d %>% dcast(subject ~ treatment, value.var = "bp") 相同)

    【讨论】:

    • 我本能地担心在您的第一个示例中重复使用 d ,但也许这是没有道理的。第二种解决方案和 Henrik 中的一个有效,不需要处理柱。
    • 不需要. 中的left_join
    猜你喜欢
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    相关资源
    最近更新 更多