基于正则表达式的列表中的子集数据帧

Subset dataframes in a list based on regex

类似于 ,但正则表达式似乎需要不同的方法。如果合适,请标记为重复。

我继承了一系列结构如下的数据帧:

variable_1 <- c(1, 2)
variable_2 <- c("A", "B")
A <- data.frame(variable_1, variable_2)
B <- data.frame(variable_1, variable_2)

我需要对 df A 进行子集化以仅包含 variable_2 包含“A”、df B 和“B”等的行,这很容易通过传统子集化:

> A[A$variable_2 %like% "A", ]

  variable_1 variable_2
1          1          A

但是,我的实际数据中有很多这样的数据框,所以我想将它们放入列表中并进行批处理:

my_list <- list(A = A, B = B) 

$A
  variable_1 variable_2
1          1          A
2          2          B

$B
  variable_1 variable_2
1          1          A
2          2          B

当我lapply以“A”为例时,一切正常:

lapply(my_list, function(x) {
    x <- x[x$variable_2 %like% "A", ]
})

$A
  variable_1 variable_2
1          1          A

$B
  variable_1 variable_2
1          1          A

但是我对 R 中的正则表达式和列表结构都不熟悉,这使我无法弄清楚如何为 my_list 中的每个 df 使用各自的 df 名称执行此操作(即信件)。这是所需的输出结构,与上面生成的结构相反(问题似乎在于 ????):

lapply(my_list, function(x) {
    x <- x[x$variable_2 %like% ????, ]
})

$A
  variable_1 variable_2
1          1          A

$B
  variable_1 variable_2
2          2          B

您可以利用 Map() 并将列表的 names() 指定为函数的参数。

代码

library(data.table)

Map(function(x, y){
  x[x$variable_2 %like% y, ]
  },
  my_list,
  names(my_list))

# $A
#   variable_1 variable_2
# 1          1          A
#
# $B
#   variable_1 variable_2
# 2          2          B

数据

variable_1 <- c(1, 2)
variable_2 <- c("A", "B")
A <- data.frame(variable_1, variable_2)
B <- data.frame(variable_1, variable_2)
my_list <- list("A" = A, "B" = B)

我们可以使用imap

library(dplyr)
library(purrr)
imap(my_list, ~ .x %>% 
          filter(variable_2 == .y))

-输出

#$A
#  variable_1 variable_2
#1          1          A

#$B
#  variable_1 variable_2
#1          2          B