具有基于逻辑条件的数值向量的data.frames的子集列表

时间:2017-03-16 15:02:29

标签: r list dataframe subset

这是我的清单的一个例子:

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)

由于

2 个答案:

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