试试mapply
。一般来说,当针对列表中的每个项目使用不同的参数对列表(df 中的列)调用相同的函数时,我会选择它:
> mapply(`[`, df, lapply(s, `:`, nrow(df)))
$x1
[1] 4 5 6 7 8 NA NA
$x2
[1] 8 9 10 11 12 13 14 15
以上将[
运算符应用于每一列(作为原子向量)并用作内部每个项目的参数
> lapply(s, `:`, nrow(df))
[[1]]
[1] 9 10 11 12 13 14 15
[[2]]
[1] 8 9 10 11 12 13 14 15
所以,第一个将是df$x1[9:15]
,第二个df$x2[8:15]
。希望这是你想要的。
编辑:sapply
更改lapply
为与哈德利在评论中讨论的那样。
EDIT2:按照以下评论中的建议比较不同方法的一些时间
set.seed(1)
df1 <- data.frame(x1 = rnorm(10000),
x2 = rnorm(10000))
method1 <- function(data, limits)
mapply(`[`, data, lapply(limits, `:`, nrow(data)))
method2 <- function(data, limits)
mapply(function(x, i) x[-(1:(i-1))], data, limits)
> identical(method1(df1, s),method2(df1, s))
[1] TRUE
>
> microbenchmark(method1(df1, s),method2(df1, s))
Unit: microseconds
expr min lq median uq max neval
method1(df1, s) 239.250 250.1550 258.6525 273.0855 423.658 100
method2(df1, s) 548.734 568.4585 584.3340 599.4075 1664.164 100