结合dplyr访问函数中的多个输出

结合dplyr访问函数中的多个输出,r,dplyr,R,Dplyr,我有这样一个函数: computeLagError <- function(x, y) { until = length(x) msd.t <- rep(0,until) sd.t <- rep(0,until) for (dt in 1:until) { displacement.x <- as.vector(na.omit(x[(1+dt):length(x)]) - x[1:(length(x)-dt)]

我有这样一个函数:

computeLagError <- function(x, y)
{
    until = length(x)

    msd.t <- rep(0,until)
    sd.t  <- rep(0,until)

    for (dt in 1:until)
    {
        displacement.x <- as.vector(na.omit(x[(1+dt):length(x)]) - x[1:(length(x)-dt)])
        displacement.y <- as.vector(na.omit(y[(1+dt):length(y)]) - y[1:(length(y)-dt)])
        sqrdispl <- (displacement.x^2 + displacement.y^2)
        msd.t[dt] <- mean(sqrdispl)
        sd.t[dt] <- sd(msd.t) # The error increases for every point, as time lag has fewer points
    }
    data_table <- as.data.table(msd.t, sd.t, sqrdispl)

    return(data_table)
}
但我得到的错误是,子集在函数上不起作用。如果我尝试以列表的形式返回值,那么我只能访问每个列表中的第一个元素


到目前为止,我的解决方案是让3个单独的函数返回3个不同的值,但这看起来相当粗糙。上面的函数甚至调用了我的函数3次,而我想调用它一次并访问值。

您的函数中有一些错误。e、 例如,返回包data.table而不是定义的datatable。向量的绑定也不起作用。选中此项:

computeLagError <- function(x, y)
{
    until = length(x)

    msd.t <- rep(0,until)
    sd.t  <- rep(0,until)

    for (dt in 1:until)
    {
        displacement.x <- as.vector(na.omit(x[(1+dt):length(x)]) - x[1:(length(x)-dt)])
        displacement.y <- as.vector(na.omit(y[(1+dt):length(y)]) - y[1:(length(y)-dt)])
        sqrdispl <- (displacement.x^2 + displacement.y^2)
        msd.t[dt] <- mean(sqrdispl)
        sd.t[dt] <- sd(msd.t) # The error increases for every point, as time lag has fewer points
    }
    data_table <- cbind.data.frame(msd.t, sd.t, sqrdispl)

    return(data_table)
}
您的代码:

df <- df %>% group_by(track_id) %>% mutate(msd = computeLagError(x, y)[,1],
                                           lag = seq_along(msd),
                                           stepsize = computeLagError(x, y)[,2],
                                           lag_error = computeLagError(x,y)[,3])

运行该函数3次似乎有点低效。你考虑过使用dplyr::do或purrr而不是mutate吗?哎呀。我不知道这段时间是怎么来的。这里才周一早上。更新主要帖子,因为这是一个令人震惊的错误。无论如何,谢谢。它起作用了。但这将调用同一个函数3次,每次访问单独的列,对吗?这里相同:是的,它会。。嗯,最简单的方法是分配给一个对象并相应地选择列,但我不确定这在dplyr中是否可行。我去看看
df = data.frame(track_id=as.factor(rep(c(1,2),each=50)),x=c(1:100),y=c(1:100))
df <- df %>% group_by(track_id) %>% mutate(msd = computeLagError(x, y)[,1],
                                           lag = seq_along(msd),
                                           stepsize = computeLagError(x, y)[,2],
                                           lag_error = computeLagError(x,y)[,3])