【问题标题】:Calculating group differences in a "badly" partitioned data set计算“严重”分区数据集中的组差异
【发布时间】:2018-11-29 14:07:48
【问题描述】:

我试图用关于 SO 的问题来解决这个问题,但我找不到令人满意的答案。我的数据框有结构

X = data_frame(
        treat = c(rep(1,4), rep(2,4), rep(3,4), rep(4,4)),
        id = seq(1:16), 
        x = rnorm(16), 
        y = rnorm(16), 
        z = rnorm(16)
    )

看起来像

# A tibble: 16 x 5
   treat    id       x       y       z
   <int> <int>   <dbl>   <dbl>   <dbl>
 1     1     1 -0.0724  1.26    0.317 
 2     1     2 -0.486  -0.628   0.392 
 3     1     3 -0.406  -0.706   1.18  
 4     1     4 -1.35   -1.27    2.36  
 5     2     5 -0.0751 -0.0394  0.568 
 6     2     6  0.243   0.873   0.132 
 7     2     7  0.138   0.611  -0.700 
 8     2     8 -0.732   1.02   -0.811 
 9     3     9 -0.0278  1.78    0.568 
10     3    10  0.526   1.18    1.03  
11     3    11  1.43    0.0937 -0.0825
12     3    12 -0.299  -0.117   0.367 
13     4    13  1.05    2.04    0.678 
14     4    14 -1.93    0.201   0.250 
15     4    15  0.624   1.09    0.852 
16     4    16  0.502   0.119  -0.843 

treat 中的每四个值都是一个控件,现在我想计算处理和控件之间xyz 的差异。例如我想计算第一次治疗

-0.724 - (-1.35) #x
1.26 - (-1.27)   #y
0.317 - 2.36     #z

第一次治疗。相应地进行第二次治疗,

-0.486 - (-1.35) #x
-0.628 - (-1.27) #y
0.392 - 2.36     #z

...等等。

我想使用dplyr / tidyverse 解决方案,但我不知道如何以“顺利”的方式做到这一点。我已经通过使用连接找到了解决方案,但与 dplyr 通常提供的“平滑”解决方案相比,这似乎相当乏味。

【问题讨论】:

    标签: r dplyr tidyr


    【解决方案1】:

    使用dplyr,我们可以group_bytreat 并使用mutate_at 选择特定列(x:z)并使用nth 函数将每个值减去第四个值。

    library(dplyr)
    X %>%
      group_by(treat) %>%
      mutate_at(vars(x:z), funs(. - nth(., 4)))
    
    
    #treat    id      x      y       z
    #   <dbl> <int>  <dbl>  <dbl>   <dbl>
    # 1     1     1 -0.631  0.971  0.206 
    # 2     1     2 -0.301 -1.49   0.189 
    # 3     1     3  1.49   1.17   0.133 
    # 4     1     4  0      0      0     
    # 5     2     5  1.39  -0.339  0.934 
    # 6     2     6  2.98   0.511  0.319 
    # 7     2     7  1.73  -0.297  0.0745
    # 8     2     8  0      0      0     
    # 9     3     9 -1.05  -0.778 -2.86  
    #10     3    10 -0.805 -1.84  -2.38  
    #11     3    11  0.864  0.684 -3.43  
    #12     3    12  0      0      0     
    #13     4    13 -1.39  -0.843  1.67  
    #14     4    14 -1.68   1.55  -0.656 
    #15     4    15 -2.34   0.722  0.0638
    #16     4    16  0      0      0     
    

    这也可以写成

    X %>%
      group_by(treat) %>%
      mutate_at(vars(x:z), funs(. - .[4]))
    

    数据

    set.seed(123)
    X = data_frame(
       treat = c(rep(1,4), rep(2,4), rep(3,4), rep(4,4)),
       id = seq(1:16), 
       x = rnorm(16), 
       y = rnorm(16), 
       z = rnorm(16)
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-06
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 2022-11-29
      • 2023-03-21
      • 1970-01-01
      • 2019-07-21
      相关资源
      最近更新 更多