мутировать несколько столбцов элегантно - PullRequest
0 голосов
/ 28 февраля 2019

Имейте df, как показано ниже

df <- read.table(text="name id_final    id1 id2 id3
sample1 10.96311    4.767571    3.692556    2.966773
sample2 10.83782    11.61998    11.402257   10.301068
sample3 13.98669    12.123346   10.299306   8.85533
sample4 13.97313    12.200774   11.874366   11.013115
sample5 13.89532    10.712515   9.102278    9.832699
sample6 13.86255    11.808834   9.180613    8.813621", header=T, sep='\t')
head(df)
> head(df)
     name id_final       id1       id2       id3
1 sample1 10.96311  4.767571  3.692556  2.966773
2 sample2 10.83782 11.619980 11.402257 10.301068
3 sample3 13.98669 12.123346 10.299306  8.855330
4 sample4 13.97313 12.200774 11.874366 11.013115
5 sample5 13.89532 10.712515  9.102278  9.832699
6 sample6 13.86255 11.808834  9.180613  8.813621

необходимо выполнить некоторую базовую математическую операцию, разделить каждый столбец со столбцом id_final и создать новые столбцы с суффиксом__log, что можно сделать с помощью простого преобразования, как показано ниже.

df <- df %>%
  mutate(id1_log = log2(id1/id_final),
         id2_log = log2(id2/id_final),
         id3_log = log2(id3/id_final))
head(df)
> head(df)
     name id_final       id1       id2       id3    id1_log     id2_log     id3_log
1 sample1 10.96311  4.767571  3.692556  2.966773 -1.2013308 -1.56996541 -1.88569067
2 sample2 10.83782 11.619980 11.402257 10.301068  0.1005330  0.07324483 -0.07328067
3 sample3 13.98669 12.123346 10.299306  8.855330 -0.2062667 -0.44150746 -0.65943661
4 sample4 13.97313 12.200774 11.874366 11.013115 -0.1956825 -0.23480474 -0.34343264
5 sample5 13.89532 10.712515  9.102278  9.832699 -0.3753018 -0.61029950 -0.49893967
6 sample6 13.86255 11.808834  9.180613  8.813621 -0.2313261 -0.59453027 -0.65338590

В данном примере легко, если есть только 3 столбца, как бы я автоматизировал это, если у меня больше 3, вводить это каждый раз не элегантно.

mutate(id1_log = log2(id1/id_final),
          id2_log = log2(id2/id_final),
          id3_log = log2(id3/id_final))

Чтобы получить более полную картину, я пытаюсь написать функцию, которую я мог бы использовать для нескольких файлов с несколькими столбцами id1 ... n

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

А вот вариант data.table:

library(data.table)
cols <- names(df)[3:5] # first, select columns you are interested in (or names(df)[grepl("id\\d+$", names(df))])
setDT(df)[, paste(cols, "log", sep = "_") :=  lapply(.SD, function(x) log2(x/id_final)),
          .SDcols = cols][] # apply { function(x) log2(x/id_final) } to selected columns
# output
      name id_final       id1       id2       id3    id1_log     id2_log     id3_log
1: sample1 10.96311  4.767571  3.692556  2.966773 -1.2013308 -1.56996541 -1.88569067
2: sample2 10.83782 11.619980 11.402257 10.301068  0.1005330  0.07324483 -0.07328067
3: sample3 13.98669 12.123346 10.299306  8.855330 -0.2062667 -0.44150746 -0.65943661
4: sample4 13.97313 12.200774 11.874366 11.013115 -0.1956825 -0.23480474 -0.34343264
5: sample5 13.89532 10.712515  9.102278  9.832699 -0.3753018 -0.61029950 -0.49893967
6: sample6 13.86255 11.808834  9.180613  8.813621 -0.2313261 -0.59453027 -0.65338590
0 голосов
/ 28 февраля 2019

Может сделать:

library(dplyr)

df %>% mutate_at(vars(matches("id\\d+$")), list(log = ~ log2(. / id_final)))

Мы мутируем (сразу с mutate_at) нужные столбцы - все они соответствуют регулярному выражению id\\d+$, которое в основном соответствует именам столбцов, которые заканчиваются числом иперед ним стоит id (например, чтобы избежать захвата id_final или любых других id_.. столбцов.

После этого мы предоставляем список с желаемыми преобразованиями. Вы можете указать имя для преобразования и это имязатем автоматически добавляется к имени столбца. Мы говорим log, поэтому столбцы автоматически получают _log в конце, вы можете написать что-нибудь еще.

Если вы не предоставите имя, ужесуществующие столбцы будут изменены, в противном случае вы получите дополнительные, как в нашем случае.

Вывод:

     name id_final       id1       id2       id3    id1_log     id2_log     id3_log
1 sample1 10.96311  4.767571  3.692556  2.966773 -1.2013308 -1.56996541 -1.88569067
2 sample2 10.83782 11.619980 11.402257 10.301068  0.1005330  0.07324483 -0.07328067
3 sample3 13.98669 12.123346 10.299306  8.855330 -0.2062667 -0.44150746 -0.65943661
4 sample4 13.97313 12.200774 11.874366 11.013115 -0.1956825 -0.23480474 -0.34343264
5 sample5 13.89532 10.712515  9.102278  9.832699 -0.3753018 -0.61029950 -0.49893967
6 sample6 13.86255 11.808834  9.180613  8.813621 -0.2313261 -0.59453027 -0.65338590
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...