根据名称删除数据帧列表中的数据帧的功能

时间:2020-07-08 12:02:01

标签: r dplyr lapply

我有一个名为Data_list的数据框列表,我想删除全名中包含 “ TAB”或“ tab”的所有数据框。我该如何处理lapply包中的grepl,一个匿名函数和dplyr

New_Data_list <- lapply(Data_list, function(x)x[names(x) != "Tab"])

2 个答案:

答案 0 :(得分:1)

具有命名数据帧的列表和命名数据帧的列表

如先前答案的注释所示,当数据帧列表是列表中的列表对象时,使用purrr::maplmap有条件地按名称删除数据帧。

数据


df <- data.frame(a = 1:2,
                 b = c("a", "b"))

df_ls2 <- list(df2 = df,
               df2tab = df,
               df2TABdf = df,
               TABdf2 = df,
               df2_5 = df)
               

df_ls <- list(df1 = df,
              df1tab = df,
              df1TABdf = df,
              TABdf1 = df,
              df1_3 = df, 
              df1_4 = df_ls2)
# df_ls

代码


library(stringr)
library(purrr)


  lmap(df_ls, function(x) x[!str_detect(names(x), "tab|TAB")]) %>% 
  map(function(x) x[!str_detect(names(x), "tab|TAB")])

#> $df1
#>   a b
#> 1 1 a
#> 2 2 b
#> 
#> $df1_3
#>   a b
#> 1 1 a
#> 2 2 b
#> 
#> $df1_4
#> $df1_4$df2
#>   a b
#> 1 1 a
#> 2 2 b
#> 
#> $df1_4$df2_5
#>   a b
#> 1 1 a
#> 2 2 b

评论

lmap删除列表中的命名数据帧

map从数据帧的子列表中删除已命名的数据帧

我没有检查这是否可以用于更深层嵌套数据框列表。

已命名数据帧列表

在列表仅包含命名数据帧的条件下删除数据帧的第一个答案:

数据


df <- data.frame(a = 1:2,
                 b = c("a", "b"))

df_ls <- list(df1 = df,
              dftab = df,
              dfTABdf = df,
              TABdf = df,
              df3 = df)
# df_ls

代码

library(stringr)

df_ls[!str_detect(names(df_ls), "tab|TAB")]
#> $df1
#>   a b
#> 1 1 a
#> 2 2 b
#> 
#> $df3
#>   a b
#> 1 1 a
#> 2 2 b

reprex package(v0.3.0)于2020-07-08创建

答案 1 :(得分:1)

您可以在grep()中以R为基数进行操作

Data_list[grep("tab", names(Data_list), ignore.case = TRUE, invert = TRUE)]

grepl()(也以R为底)

Data_list[!grepl("tab", names(Data_list), ignore.case = TRUE)]

示例数据:

Data_list <- list(
  df_tab  = iris[1:2, 1:2],
  df_TAB  = iris[1:2, 3:5],
  df_good = iris[1:2, 4:5]
)