将矩阵的每一行作为 r 中的输入的函数
Applying function with every row of matrix as the input in r
我看过一些帖子展示了如何使用 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
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
})
我看过一些帖子展示了如何使用 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
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
})