У меня есть функция с четырьмя параметрами, три из которых берутся из данного фрейма данных. Я хочу иметь возможность использовать функцию с заданным фреймом данных, используя вектор чисел в качестве аргумента для четвертого параметра.
Я знаю, как это делать с одним значением за раз, но я уверен, что есть простой способ сделать это, возможно, с помощью цикла for
Вот пример, в котором a и b являются переменными из кадра данных df, c — количество строк в df, а d — вектор, скажем, целых чисел от 1 до 3:
set.seed(42)
a<-runif (100,1,100)
b<-runif (100,1,100)
df<-data.frame(a,b)
fun1 <- function (a, b, c, d) {
z <- sum (( a - d ) * b / c )
return(z)
}
Если я запускаю его по одному значению за раз:
fun1(df$a, df$b, nrow(df), 1)
fun1(df$a, df$b, nrow(df), 2)
fun1(df$a, df$b, nrow(df), 3)
> fun1(df$a, df$b, nrow(df), 1)
>[1] 2696.223
> fun1(df$a, df$b, nrow(df), 2)
>[1] 2643.748
> fun1(df$a, df$b, nrow(df), 3)
>[1] 2591.273
Я хочу сделать что-то вроде этого (он должен возвращать все три значения сразу):
fun1(df$a, df$b, nrow(df), c(1:3))
Надеюсь, я был понятен. Заранее спасибо.
@Грегор Спасибо, это сработало отлично
Вы можете использовать sapply()
внутри своей функции
fun1 <- function (a, b, c, d) {
sapply(d, function(x) { sum (( a - x ) * b / c ) })
}
fun1(df$a, df$b, nrow(df), c(1:3))
# [1] 2696.223 2643.748 2591.273
Вы можете использовать команду "map" из пакета purrr. Вы можете установить муррр из команды, используя install.packages("purrr")
Это будет выглядеть примерно так:
# load purr library
library(purrr)
# Map your function
map(c(1:3), function(x) {fun1(df$a, df$b, nrow(df), x)})
На выходе список:
> map(c(1:3), function(x) {fun1(df$a, df$b, nrow(df), x)})
[[1]]
[1] 2696.223
[[2]]
[1] 2643.748
[[3]]
[1] 2591.273
sapply(1:3, fun1, a = df$a, b = df$b, c = nrow(df))