Вычтите и найдите разницу значения или объема

#r #calculated-columns

#r #вычисляемые столбцы

Вопрос:

У меня есть измерения объема частей мозга (зрительная доля, обонятельная доля, слуховая кора и т. Д.), Все части составят общий объем мозга. Как показано в примере фрейма данных здесь.

 a   b   c   d   e   total
1   2   3   4   5   15
2   3   4   5   6   20
4   6   7   8   9   34
7   8   10  10  15  50
  

Я хотел бы найти разницу в объеме мозга, если я вычту один компонент из общего объема.
Итак, мне было интересно, как это сделать в R, без необходимости создавать новый столбец для каждой части мозга.

 For example: (total - a = 14, total - b =13, and so on for other components).

total-a total-b total-c total-d total-e
14      13      12      11      10
18      17      16      15      14
30      28      27      26      25
43      42      40      40      35
  

Ответ №1:

Вы можете сделать

 dat[, "total"] - dat[1:5]
#   a  b  c  d  e
#1 14 13 12 11 10
#2 18 17 16 15 14
#3 30 28 27 26 25
#4 43 42 40 40 35
  

Ответ №2:

Если вам нужны также имена столбцов, то одной tidyverse из возможностей может быть:

 df %>%
 gather(var, val, -total) %>%
 mutate(var = paste0("total-", var),
        val = total - val) %>%
 spread(var, val)

  total total-a total-b total-c total-d total-e
1    15      14      13      12      11      10
2    20      18      17      16      15      14
3    34      30      28      27      26      25
4    50      43      42      40      40      35
  

Если вас не волнуют имена столбцов, то с помощью just dplyr вы можете сделать:

 df %>%
 mutate_at(vars(-matches("(total)")), list(~ total - .))

   a  b  c  d  e total
1 14 13 12 11 10    15
2 18 17 16 15 14    20
3 30 28 27 26 25    34
4 43 42 40 40 35    50
  

Или без имен столбцов с помощью просто base R :

 df[, grepl("total", names(df))] - df[, !grepl("total", names(df))] 

   a  b  c  d  e
1 14 13 12 11 10
2 18 17 16 15 14
3 30 28 27 26 25
4 43 42 40 40 35