似乎变异和应用工作方式不同,我想要一些见解。首先,我将从一个例子开始:
df = data.frame(base = as.character(letters), dat1 = runif(26), dat2 = runif(26))
df = df %>% mutate(path = paste0(base,'.txt'))
test_function = function(path){
print(length(path))
if(exists(path)){
table = read.table(path)
return(mean(table[,1]))
} else {
return(NA)
}
}
# This prints 26 ones
df$val = unlist(
lapply(
df$path,
test_function
)
)
# This prints 26
df = df %>% mutate(val = test_function(path))
两个函数都会产生相同的结果,但它们会打印不同的值。
我似乎用apply,我们调用函数26次,每次都将一个路径传递给函数。
使用mutate时,似乎我们一次调用该函数。传递它的路径向量。
我的问题归结为此。当我写我的真实功能。我需要担心这些差异吗?我刚刚从库中调用了一个函数,其中库检查传递的参数的维度,并且它使用mutate引发了错误。
任何见解都将受到赞赏。
答案 0 :(得分:0)
我发现@yeedle和@thelatemail的评论足以回答我的问题。另外,请查看此link,其中描述了矢量化代码的原因。 (这是一个很好的阅读)
总结他们的意见:
apply
不会尝试向量化操作,而dplyr
函数mutate
则需要向量化函数。大多数函数都可以使用Vectorize进行矢量化。
在上面的示例中,if else
代码仅针对向量化函数的df$path
的第一个值运行一次,但对于lapply
,它只会循环if else
超过df$path
中的每个值,因此您可以得到26个不同的结果,而不只是一个。