【问题标题】:r: how to remove row numbers coming from a separate list in multiple data frames using lapplyr:如何使用 lapply 从多个数据帧中的单独列表中删除行号
【发布时间】:2014-09-17 14:48:44
【问题描述】:

我在一个列表对象中组织了许多数据框。我有第二个向量列表,其中包含我想在数据框中删除的行号。对于每个数据框,要删除的行是不同的。因此,数据帧列表中的元素数量等于向量列表中的元素数量。这是我尝试过的代码:

test_list<-vector(mode="list",5)
test_list<-lapply(test_list, function(x) data.frame(1,1:10,"c"))
vec_list<-vector(mode="list",5)
vec_list<-lapply(vec_list, function (x) x<-sample(seq(1,10),4))
clean_list<-lapply(test_list, function (x,y) clean_list<-x[-y,],vec_list)

【问题讨论】:

    标签: r list lapply


    【解决方案1】:

    当您有多个对应对象列表时,Mapmapply 函数比 lapply 更自然。

    Map(function(l, v) l[-v,], test_list, vec_list)
    

    【讨论】:

      【解决方案2】:

      如果你想使用lapply,一种方法是:

        lapply(seq_along(test_list), function(i) test_list[[i]][-vec_list[[i]],])
      

      基准测试

      在介质列表数据上,

       set.seed(45)
       test_list<-vector(mode="list",25e3)
       test_list<-lapply(test_list, function(x) data.frame(1,1:10,"c"))
       vec_list<-vector(mode="list",25e3)
       vec_list<-lapply(vec_list, function (x) x<-sample(seq(1,10),4))
      
       library(microbenchmark)
       f1 <- function() lapply(seq_along(test_list), function(i) test_list[[i]][-vec_list[[i]],])
       f2 <- function() Map(function(l, v) l[-v,], test_list, vec_list)
      
       microbenchmark(f1(), f2(), unit="relative", times=25L)
       #Unit: relative
       #expr       min        lq  median       uq       max neval
       #f1() 0.9874164 0.9977816 1.00573 1.000419 0.9837334    25
       #f2() 1.0000000 1.0000000 1.00000 1.000000 1.0000000    25
      

      【讨论】:

      • 太好了,两种解决方案都能完美运行。微基准似乎是评估功能效率的一种非常有用的方法。非常感谢!
      猜你喜欢
      • 2021-01-07
      • 1970-01-01
      • 2018-06-08
      • 2013-10-15
      • 2020-05-21
      • 1970-01-01
      • 1970-01-01
      • 2017-04-04
      • 2021-08-19
      相关资源
      最近更新 更多