这是我的清单的一个例子:
df1 = data.frame(a = c(1,1,1,2,3,3,4,4,5,6,6,7,8,9,9,10))
df2 = data.frame(a = c(1,2,2,2,3,4,5,5,6,6,7,8,9,9,10,10,11))
lst = list(df1, df2)
lst = lapply(lst, function(z) {z$id = seq.int(nrow(z)); return(z)})
现在我需要根据逻辑条件对每个data.frame进行子集化,即我希望获得两个带有id
>的data.frames。 8表示df1和id
> 12表示df2。
num_vec = c(8, 12)
这是我的预期结果:
> lst
[[1]]
a id
5 9
6 10
6 11
7 12
8 13
9 14
9 15
10 16
[[2]]
a id
9 13
9 14
10 15
10 16
11 17
使用单个data.frame,语法为:
df1$id = seq.int(nrow(df1))
df2$id = seq.int(nrow(df2))
df1_sub = subset(df1, id > 8)
df2_sub = subset(df2, id > 12)
由于
答案 0 :(得分:3)
你可以尝试
Map(f=function(x, y) x[ x$id > y,], lst, num_vec)
Map是mapply的简单包装器,因此该函数将应用于每个...参数的第一个元素,第二个元素,第三个元素等等。
答案 1 :(得分:3)
lapply(seq_along(num_vec), function(i) lst[[i]][lst[[i]]$id > num_vec[i],])
#[[1]]
# a id
#9 5 9
#10 6 10
#11 6 11
#12 7 12
#13 8 13
#14 9 14
#15 9 15
#16 10 16
#[[2]]
# a id
#13 9 13
#14 9 14
#15 10 15
#16 10 16
#17 11 17