函数与apply一起工作,但不是mutate R寻求更深入的理解

时间:2017-03-22 23:04:34

标签: r dplyr

似乎变异和应用工作方式不同,我想要一些见解。首先,我将从一个例子开始:

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引发了错误。

任何见解都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

我发现@yeedle和@thelatemail的评论足以回答我的问题。另外,请查看此link,其中描述了矢量化代码的原因。 (这是一个很好的阅读)

总结他们的意见:

apply不会尝试向量化操作,而dplyr函数mutate则需要向量化函数。大多数函数都可以使用Vectorize进行矢量化。

在上面的示例中,if else代码仅针对向量化函数的df$path的第一个值运行一次,但对于lapply,它只会循环if else超过df$path中的每个值,因此您可以得到26个不同的结果,而不只是一个。