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

时间:2017-05-15 08:55:00

标签: 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)])
        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)
}

我想返回三个值msd.tsd.tsqrdispl,以便与dplyr一起使用。

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个单独的函数返回3个不同的值,但这看起来非常h​​acky。上面甚至调用我的函数3次,而我想调用它一次并访问值。

1 个答案:

答案 0 :(得分:1)

您的功能有一些错误。例如,返回包data.table而不是定义的数据表。载体的结合也不起作用。检查一下:

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 = 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])