我的目标是创建一个新变量,该变量与fun(5)的每一行的输出相匹配,但现在fun(1:5)不能提供所需的输出。请告诉我如何创建一个允许我以矢量化方式执行此操作的新函数,因为循环它需要很长时间。
我希望f(1:5)生成一个包含5个元素的向量,每个元素与f(5)给出的对应每行的输出相匹配。
由于
names1 = c("x","y","z")
names2 <- c("hi","hello","bye")
fun <- function(x){paste(names2[which(df[x,names1] == 1)],collapse = " ")}
df <- data.frame(a = c(0,1,2,3,4),x = c(0,0,1,0,1),y = c(0,1,0,0,1),z = c(0,1,0,1,0))
fun(5) = "hi hello"
fun(1:5) = "bye NA NA NA NA NA"
答案 0 :(得分:2)
您可以通过以下方式使用Vectorize
(如果我理解正确的结果):
names1 = c("x","y","z")
names2 <- c("hi","hello","bye")
fun <- function(x){
paste(names2[which(df[x,names1] == 1)],collapse = " ")
}
df <- data.frame(a = c(0,1,2,3,4),
x = c(0,0,1,0,1),
y = c(0,1,0,0,1),
z = c(0,1,0,1,0))
vfun <- Vectorize(fun)
vfun(5)
## [1] "hi hello"
vfun(1:5)
## [1] "" "hello bye" "hi" "bye" "hi hello"
这实际上为你的函数提供了一个包装器来处理长度为&gt;的值的向量。 1。