结合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])