我有一个名为Data_list
的数据框列表,我想删除全名中包含 “ TAB”或“ tab”的所有数据框。我该如何处理lapply
包中的grepl
,一个匿名函数和dplyr
?
New_Data_list <- lapply(Data_list, function(x)x[names(x) != "Tab"])
答案 0 :(得分:1)
如先前答案的注释所示,当数据帧列表是列表中的列表对象时,使用purrr::map
和lmap
有条件地按名称删除数据帧。
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]
)