我正在尝试将函数应用于二维数据列表。
我正在处理的数据随着时间的推移从许多探测器中进行测量。我将时间索引应用于矩阵,该矩阵在探测更改时重置。
我已经通过将列表转换为单独的数据帧来实现这一点,但是,我想使用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
我想在不同实验的类似矩阵列表中使用Map系列中的函数来完成此过程。
答案 0 :(得分: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))
}
)
如果我弄错了,请发表评论。
答案 1 :(得分: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]