将每行矩阵的函数应用为r中的输入

问题描述 投票:0回答:1

我看过帖子展示了如何使用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
r for-loop apply lapply sapply
1个回答
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
})
© www.soinside.com 2019 - 2024. All rights reserved.