使用单独列

时间:2017-10-13 21:48:19

标签: r list lapply

我正在尝试将函数应用于二维数据列表。

我正在处理的数据随着时间的推移从许多探测器中进行测量。我将时间索引应用于矩阵,该矩阵在探测更改时重置。

我已经通过将列表转换为单独的数据帧来实现这一点,但是,我想使用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系列中的函数来完成此过程。

2 个答案:

答案 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]