繁体   English   中英

嵌套组中的对之间的dplyr差异

[英]dplyr differences between pairs in nested groups

我想使用dplyr来计算差异value之间people嵌套在pairsession

dat <- data.frame(person=c(rep(1, 10), 
                           rep(2, 10),
                           rep(3, 10), 
                           rep(4, 10),
                           rep(5, 10),
                           rep(6, 10),
                           rep(7, 10),
                           rep(8, 10)),
                  pair=c(rep(1, 20),
                         rep(2, 20),
                         rep(3, 20),
                         rep(4, 20)),
                  condition=c(rep("NEW", 10), 
                              rep("OLD", 10),
                              rep("NEW", 10), 
                              rep("OLD", 10),
                              rep("NEW", 10),
                              rep("OLD", 10),
                              rep("NEW", 10),
                              rep("OLD", 10)),
                  session=rep(seq(from=1, to=10, by=1), 8),
                  value=c(0, 2, 4, 8, 16, 16, 18, 20, 20, 20,
                          0, 1, 1, 2, 4, 5, 8, 12, 15, 15,
                          0, 2, 8, 10, 15, 16, 18, 20, 20, 20,
                          0, 4, 4, 6, 6, 8, 10, 12, 12, 18,
                          0, 6, 8, 10, 16, 16, 18, 20, 20, 20,
                          0, 2, 2, 3, 4, 8, 8, 8, 10, 12,
                          0, 10, 12, 16, 18, 18, 18, 20, 20, 20,
                          0, 2, 2, 8, 10, 10, 11, 12, 15, 20)
                  )

例如, person 1和2成对( pair==1 ):

  • person==1session==2 :2
  • person==2session==2 :1

差( NEW - OLD )是2-1=1

到目前为止,这是我尝试过的。 我想我需要先group_by()然后再进行summarise() ,但是我还没有破解。

dat %>%
    mutate(session = factor(session)) %>%
    group_by(condition, pair, session) %>%
    summarise(pairDiff = value-first(value))

所需的输出:

在此处输入图片说明

您的输出可以通过以下方式获得:

dat %>% group_by(pair,session) %>% arrange(condition) %>% summarise(diff = -diff(value))
Source: local data frame [40 x 3]
Groups: pair [?]

# A tibble: 40 x 3
    pair session  diff
   <dbl>   <dbl> <dbl>
 1     1       1     0
 2     1       2     1
 3     1       3     3
 4     1       4     6
 5     1       5    12
 6     1       6    11
 7     1       7    10
 8     1       8     8
 9     1       9     5
10     1      10     5
# ... with 30 more rows

这种arrange可确保NEW和OLD位置正确,但是解决方案的确取决于对和会话的每种组合都准确地有2个值。

您可以将condition传播到标题,然后进行减法NEW - OLD

library(dplyr); library(tidyr)

dat %>% 
    select(-person) %>% 
    spread(condition, value) %>% 
    mutate(diff = NEW - OLD) %>% 
    select(session, pair, diff)

# A tibble: 40 x 3
#   session  pair  diff
#     <dbl> <dbl> <dbl>
# 1       1     1     0
# 2       2     1     1
# 3       3     1     3
# 4       4     1     6
# 5       5     1    12
# 6       6     1    11
# 7       7     1    10
# 8       8     1     8
# 9       9     1     5
#10      10     1     5
# ... with 30 more rows

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM