将函数的每行矩阵作为r

时间:2019-03-03 06:20:02

标签: r for-loop apply lapply sapply

我看过一些帖子,展示了如何使用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函数无法正常工作,这给我的错误是con和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 :(得分:0)

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