我有这样的功能:
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.t
,sd.t
和sqrdispl
,以便与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个不同的值,但这看起来非常hacky。上面甚至调用我的函数3次,而我想调用它一次并访问值。
答案 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])