Применение функции с каждой строкой матрицы в качестве входных данных в r - PullRequest
0 голосов
/ 03 марта 2019

Я видел сообщения, показывающие, как использовать apply, sapply, dplyr, plyr и т. Д. Для запуска функции в каждой строке матрицы.Тем не менее, я изо всех сил пытаюсь создать R-скрипт, который позволит мне запустить функцию, которая будет обрабатывать каждую строку как входные данные.Вот некоторые примеры данных:

> ` Time.course..| timecourse1 | X | X.1 | X.2| X.3 | X.4 | X.5 | X.6 | X.7
1 YORF | 0 | 5.000 |10.000| 15.000 | 20 30.000 |40.000 | 50.000 | 60.000
2 YAL026C |1| 0.7030321 | NA | NA | NA | 0.7130882 | 0.3322182 | 0.2153255 | 0.2264951

Может быть трудно сказать, но по сути у меня есть временной ряд в моем первом ряду от 0 до 60 и соответствующие уровни экспрессии для некоторых генов 6000+.У меня есть функция для расчета периода полураспада, но мне нужно зациклить ее по всему фрейму данных с входными данными, являющимися каждой строкой в ​​течение одних и тех же значений времени.

Вот что я смог сделать для одной строкипосле преобразования кадра данных x в матрицу:

`> y <- x[1,]
> time <- c(0,5,10,15,20,30,40,50,60)
> result <- pk.calc.half.life(conc = y, time = time)
> print(result$half.life)
[1] 17.89096`

Но мне нужен быстрый эффективный способ выполнить это для каждой строки и сохранить это значение в новом столбце в моем исходном кадре данных.Функции sapply и lapply не сработали, что привело к ошибке, что conc и time должны быть одинаковой длины.

> sapply(x, pk.calc.half.life(x, time = time))
Error in check.conc.time(conc, time) : 
  Conc and time must be the same length
In addition: Warning message:
In check.conc.time(conc, time) : Negative concentrations found
> lapply(x, pk.calc.half.life(x, time = time))
Error in check.conc.time(conc, time) : 
  Conc and time must be the same length
In addition: Warning message:
In check.conc.time(conc, time) : Negative concentrations found

1 Ответ

0 голосов
/ 03 марта 2019

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

data <- structure(list(Time.course = c("YORF", "YAL026C"), 
                      timecourse1 = c(0, 1), 
                      X = c(5, 0.7030321), 
                      X.1 = c(10, NA), 
                      X.2 = c(15, NA), 
                      X.3 = c(20, NA), 
                      X.4 = c(30, 0.7130882), 
                      X.5 = c(40, 0.3322182), 
                      X.6 = c(50, 0.2153255), 
                      X.7 = c(60, 0.2264951)), 
                 row.names = c(NA, -2L), class = c("data.frame"))

time <- as.numeric(data[1, -1])
half_life <- apply(data[-1,-1], 1, function(x) {
  PKNCA::pk.calc.half.life(conc = x, time = time)$half.life
})
...