【问题标题】:Applying dplyr::filter to a list of data frames将 dplyr::filter 应用于数据帧列表
【发布时间】:2020-03-05 18:55:54
【问题描述】:

我需要使用dplyr::filter 过滤数据框列表。这应该很容易,但不知何故它不起作用。数据框列表是dflist,过滤器的基础是id变量的值,应该包含在include_vector中(过滤掉那些id不在include_vector中的行)。

lapply(dflist, function(x){dplyr::filter(x, id %!in% include_vector)})

函数排序工作(通过dflist 并且没有错误消息),但是如果我在过滤完成后查看data.frames,data.frames 完全相同。可能是什么问题?

【问题讨论】:

  • 试试lapply(dflist, function(x){dplyr::filter(x, !(id %in% include_vector))})
  • 您的代码中有错字:!operator 放错地方了。

标签: r list dataframe tidyverse lapply


【解决方案1】:

使用purrr 和与Cettt 相同的测试数据(谢谢!):

purrr::map(dflist, ~ dplyr::filter(., !(id %in% include_vector)))

【讨论】:

    【解决方案2】:

    我认为您对 lapply 所做的事情感到困惑。它不会改变原来的data.frames,而只是在列表中。

    查看这个玩具示例:

    df1 <- data.frame(id = letters[1:5])
    df2 <- data.frame(id = letters[4:10])
    
    dflist <- list(df1 = df1, df2 = df2)
    include_vector <- c("d", "e", "f")
    
    new_list <- lapply(dflist, function(x) dplyr::filter(x, ! id %in% include_vector))
    

    现在new_list 看起来像这样:

    $df1
      id
    1  a
    2  b
    3  c
    
    $df2
      id
    1  g
    2  h
    3  i
    4  j
    

    但是df1df2 并没有改变。如果您也想更改df1df2,您可以这样做:

    list2env(new_list, environment())
    

    这将覆盖您当前工作环境中的df1df2

    【讨论】:

    • 谢谢,我怀疑是这样的。但是,我现在在应用list2env(new_list, environment()) 命令后收到一条错误消息:Error in list2env(newlist, environment()) : names(x) must be a character vector of the same length as x。这是关于什么的?
    • 你的名单有名字吗?您可以通过键入names(dflist) 进行检查。 list2env 仅适用于命名列表。
    • 不,它没有,但我使用tibble::lst 而不是list 修复了它。太好了,非常感谢!
    猜你喜欢
    • 2020-04-17
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    相关资源
    最近更新 更多