Рассчитайте разницу между одной строкой и остальными данными по группе - PullRequest
1 голос
/ 08 мая 2019

У меня есть data.table с тремя id группами.Первая группа (batch1) зафиксировала dx и изменилась dy.2-я группа (batch1) и 3-я группа (batch2) имеют различную dx и фиксированную dy.

Я хочу вычислить разницу между строкой id, заканчивающейся 1, и другими строками, заканчивающимися 2, 3 и т. Д. Для каждой группы.

Как мне это сделать?Я открыт для решений base, dplyr или data.table.

library(data.table)
dt <- data.table(
  id = as.factor(c("batch1_dx0.0_dy-2.1_4", "batch1_dx0.0_dy0.155_3",
                   "batch1_dx0.0_dy1.23_2", "batch1_dx0.0_dy1_1", 
                   "batch1_dx-0.8_dy1.0_2", "batch1_dx0_dy1.0_1",
                   "batch1_dx1.321_dy1.0_3", "batch1_dx4.12_dy1.0_4",
                   "batch2_dx-0.8_dy1.0_2", "batch2_dx0_dy1.0_1",
                   "batch2_dx1.321_dy1.0_3", "batch2_dx4.12_dy1.0_4")),
  val1 = c(6, 2, 2, 0, 3, 1, 3, 3, 4, 5, 1),
  val2 = c(6, 4, 2, 1, 1, 1, 5, 3, 2, 8, 9),
  val3 = c(6, 3, 3, 0, 4, 2, 4, 1, 5, 7, 1))

                        id val1 val2 val3
 1:  batch1_dx0.0_dy-2.1_4    6    6    6
 2: batch1_dx0.0_dy0.155_3    2    4    3
 3:  batch1_dx0.0_dy1.23_2    2    2    3
 4:     batch1_dx0.0_dy1_1    0    1    0
 5:  batch1_dx-0.8_dy1.0_2    3    1    4
 6:     batch1_dx0_dy1.0_1    1    1    2
 7: batch1_dx1.321_dy1.0_3    3    5    4
 8:  batch1_dx4.12_dy1.0_4    3    3    1
 9:  batch2_dx-0.8_dy1.0_2    4    2    5
10:     batch2_dx0_dy1.0_1    5    8    7
11: batch2_dx1.321_dy1.0_3    1    9    1
12:  batch2_dx4.12_dy1.0_4    6    6    6

Ожидаемый результат

    id  val1    val2    val3    dval1   dval2   dval3
batch1_dx0.0_dy-2.1_4   6   6   6   6   5   6
batch1_dx0.0_dy0.155_3  2   4   3   2   3   3
batch1_dx0.0_dy1.23_2   2   2   3   2   1   3
batch1_dx0.0_dy1_1  0   1   0   0   0   0
batch1_dx-0.8_dy1.0_2   3   1   4   2   0   2
batch1_dx0_dy1.0_1  1   1   2   0   0   0
batch1_dx1.321_dy1.0_3  3   5   4   2   4   2
batch1_dx4.12_dy1.0_4   3   3   1   2   2   -1
batch2_dx-0.8_dy1.0_2   4   2   5   -1  -6  -2
batch2_dx0_dy1.0_1  5   8   7   0   0   0
batch2_dx1.321_dy1.0_3  1   9   1   -4  1   -6
batch2_dx4.12_dy1.0_4   6   6   6   1   -2  -1

enter image description here

1 Ответ

2 голосов
/ 08 мая 2019

Сначала мы извлекаем последнюю числовую часть из каждого id.(ind).Затем мы создаем группы для каждой 4-й строки и для каждого столбца, который starts_with "val", вычитаем его значение из значения с 1 в столбце ind.

library(dplyr)

 dt %>%
   mutate(ind = sub(".*_(\\d+$)", "\\1", id)) %>%
   group_by(group = gl(n()/4, 4)) %>%
   mutate_at(vars(starts_with("val")), list(d = ~(. - .[ind == 1]))) %>%
   ungroup() %>%
   select(-group, -ind)



#     id                     val1  val2  val3 val1_d val2_d val3_d
#    <fct>                  <dbl> <dbl> <dbl>  <dbl>  <dbl>  <dbl>
# 1 batch1_dx0.0_dy-2.1_4      6     6     6      6      5      6
# 2 batch1_dx0.0_dy0.155_3     2     4     3      2      3      3
# 3 batch1_dx0.0_dy1.23_2      2     2     3      2      1      3
# 4 batch1_dx0.0_dy1_1         0     1     0      0      0      0
# 5 batch1_dx-0.8_dy1.0_2      3     1     4      2      0      2
# 6 batch1_dx0_dy1.0_1         1     1     2      0      0      0
# 7 batch1_dx1.321_dy1.0_3     3     5     4      2      4      2
# 8 batch1_dx4.12_dy1.0_4      3     3     1      2      2     -1
# 9 batch2_dx-0.8_dy1.0_2      4     2     5     -1     -6     -2
#10 batch2_dx0_dy1.0_1         5     8     7      0      0      0
#11 batch2_dx1.321_dy1.0_3     1     9     1     -4      1     -6
#12 batch2_dx4.12_dy1.0_4      6     6     6      1     -2     -1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...