【问题标题】:Subset list of data.frames with a numeric vector based on a logical condition [closed]具有基于逻辑条件的数字向量的 data.frames 子集列表 [关闭]
【发布时间】:2017-08-07 20:14:01
【问题描述】:

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

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 进行子集化,即我想获得两个 data.frame,其中 id > 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)

谢谢

【问题讨论】:

  • 一个选项与@​​987654327@ lst %>% map2(num_vec, ~ .x[.x$id > .y,])

标签: r list dataframe subset


【解决方案1】:

你可以试试

Map(f=function(x, y) x[ x$id > y,], lst, num_vec)

Map 是一个简单的 mapply 包装器,因此该函数将应用于每个 ... 参数的第一个元素、第二个元素、第三个元素等等。

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      猜你喜欢
      • 2011-10-19
      • 2018-10-09
      • 1970-01-01
      • 2018-04-08
      • 1970-01-01
      • 1970-01-01
      • 2019-12-16
      • 2014-04-17
      • 2018-06-06
      相关资源
      最近更新 更多