Вычисление групповых различий в «плохо» разделенном наборе данных - PullRequest
0 голосов
/ 29 ноября 2018

Я пытался решить проблему с вопросами здесь, на 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 является контрольной, и теперь я хочу вычислить разницу в x, y и z между обработками и контролем.Например, я хотел бы рассчитать для первой процедуры

-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, но не знаю, как это сделать.что "гладко".Я уже нашел решение с помощью объединений, но оно кажется довольно утомительным по сравнению с «гладким» решением, которое обычно предлагает 1021

1 Ответ

0 голосов
/ 29 ноября 2018

С помощью dplyr мы можем group_by treat и использовать mutate_at для выбора определенных столбцов (x: z) и вычитать каждое значение из 4-го значения с помощью функции 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]))

data

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)
)
...