基于正则表达式的列表中的子集数据帧
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
类似于
我继承了一系列结构如下的数据帧:
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