2017-10-13 47 views
0

我试图将函数应用于二维数据列表。使用单独的列中的值将列表中的列应用到列中

我正在处理的数据需要从很多探针随时间进行测量。我将一个时间索引应用于矩阵,当探针更改时重置。

我已经通过将列表转换为单独的数据框来实现此目的,但是,我希望使用lapply()系列中的某些内容来实现此目的,因为我的数据集正在增长。

这是工作的各个矩阵的方法:

source = c(1,1,1,2,2,2,3,3,3,4,4,4) 
df1 = data.frame(source) 
df1$elapsedTime <- (ave(df1$source, df1$source, FUN = seq_along)) 

df 
# source elapsedTime 
# 1  1   1 
# 2  1   2 
# 3  1   3 
# 4  2   1 
# 5  2   2 
# 6  2   3 
# 7  3   1 
# 8  3   2 
# 9  3   3 
# 10  4   1 
# 11  4   2 
# 12  4   3 

我想在不同的实验相似矩阵的列表中使用从地图家庭功能的这一过程。

回答

1

我觉得应该给你想要的lapply代码基地:

source = c(1,1,1,2,2,2,3,3,3,4,4,4) 
df.in = data.frame(source) 

df.list <- split(df.in, f = df$source) 
res <- lapply(df.list, function(df){ 
    df$elapsedTime <- seq_along(1:length(df$source)) 
    return(df) 
}) 
df.out <- bind_rows(res) 

df.out 
# source elapsedTime 
# 1  1   1 
# 2  1   2 
# 3  1   3 
# 4  2   1 
# 5  2   2 
# 6  2   3 
# 7  3   1 
# 8  3   2 
# 9  3   3 
# 10  4   1 
# 11  4   2 
# 12  4   3 

注意data.table包已为此专门功能为好,这可以很方便的更大的数据集。另外如果你只是想在一个组内做一些计算,那么使用data.table更简单:

library(data.table) 
dt = data.table(source) 
dt[, elapsedTime := 1:.N, by = source] 
1

如果我理解正确,您的数据就是发布示例中的数据框列表。如果是这样的话:

数据:

lis = list(df1 = data.frame(source = c(1,1,1,2,2,2,3,3,3,4,4,4)), 
      df2 = data.frame(source = rep(1:5, each = 4))) 

功能:

lapply(lis, function(x){ 
    elapsedTime = ave(x[,1], x[,1], FUN = seq_along) 
    return(data.frame(x, elapsedTime)) 
} 
) 

如果我错了,请发表评论。

相关问题