R 在列表中的多个数据帧中使用 grepl
R using grepl across multiple dataframes in a list
我有一个数据框列表,每个数据框都包含多个相同的列。在其中一列中,有多个实例其中一行仅包含“[]”。我的目标是用空白替换这些实例。
我已经尝试通过地图功能和 grepl 这样做。当它运行时,输出没有变化。我走的方向对吗?
请注意我区分了“[]”和“[value]”
我只想用空格替换空括号。
我的代码如下:
first_column <- c("1", "2", "3","4")
second_column <- c("value1", "value2","[]","[value]")
first_column_2 <- c("5", "6", "7","8")
second_column_2 <- c("value1", "[]","[]","[value2]")
first_column_3<- c("9", "10", "11","12")
second_column_3 <- c("[]", "[value2]","[]","[]")
df_1 <- data.frame(first_column,second_column)
df_2 <- data.frame(first_column_2,second_column_2)
df_3 <- data.frame(first_column_3,second_column_3)
df_list <- list(df_1,df_2,df_3)
var <- c(2)
df_list <- map(df_list, ~.x[!grepl("[[]",var),])
谢谢!
我们可以使用 lapply
和 gsub
来完成这个。 grepl
returns 如果模式匹配则为 true 或 false,而 gsub
允许您用其他内容替换匹配项。请注意,您可以轻松地指定 NA
,而不是指定空字符串 (''
),但这取决于您对“空白”的定义。
这里我使用基本 R 的 lapply
,在这种情况下等同于 purrr::map
(甚至语法在这里可以互换)。
data <- lapply(df_list, function(x) {
x %>%
mutate(across(where(is.character), ~gsub('\[\]', '', .x)))
})
[[1]]
first_column second_column
1 1 value1
2 2 value2
3 3
4 4 [value]
[[2]]
first_column_2 second_column_2
1 5 value1
2 6
3 7
4 8 [value2]
[[3]]
first_column_3 second_column_3
1 9
2 10 [value2]
3 11
4 12
您遇到了一些问题:
- (a) 你说你想用
""
替换 "[]"
,但你的代码试图完全删除它们,而不是替换它们。使用 sub
而不是 grepl
进行替换——甚至更好,因为您匹配的是整个字符串,根本不要使用正则表达式
- (b) 你在数字 2 上 运行
grepl
:你有 var <- 2
并且你的命令是 grepl("[[]",var)
,也就是 grepl("[[]", 2)
,这总是 FALSE
因为字符串“2”不包含方括号。
- (c) 您的
grepl
模式正在搜索其中包含 [
的任何字符串。因此,如果您更正 (a) 和 (b),您仍然会匹配 "[value1]"
. 这样的字符串
正如我在 (a) 中所说的,当您匹配一个完整的字符串时,您根本不需要正则表达式。我会这样做:
df_list <- map(df_list, ~ {
.x[[var]][.x[[var]] == "[]"] = ""
.x
})
df_list
# [[1]]
# first_column second_column
# 1 1 value1
# 2 2 value2
# 3 3
# 4 4 [value]
#
# [[2]]
# first_column_2 second_column_2
# 1 5 value1
# 2 6
# 3 7
# 4 8 [value2]
#
# [[3]]
# first_column_3 second_column_3
# 1 9
# 2 10 [value2]
# 3 11
# 4 12
我有一个数据框列表,每个数据框都包含多个相同的列。在其中一列中,有多个实例其中一行仅包含“[]”。我的目标是用空白替换这些实例。
我已经尝试通过地图功能和 grepl 这样做。当它运行时,输出没有变化。我走的方向对吗?
请注意我区分了“[]”和“[value]”
我只想用空格替换空括号。
我的代码如下:
first_column <- c("1", "2", "3","4")
second_column <- c("value1", "value2","[]","[value]")
first_column_2 <- c("5", "6", "7","8")
second_column_2 <- c("value1", "[]","[]","[value2]")
first_column_3<- c("9", "10", "11","12")
second_column_3 <- c("[]", "[value2]","[]","[]")
df_1 <- data.frame(first_column,second_column)
df_2 <- data.frame(first_column_2,second_column_2)
df_3 <- data.frame(first_column_3,second_column_3)
df_list <- list(df_1,df_2,df_3)
var <- c(2)
df_list <- map(df_list, ~.x[!grepl("[[]",var),])
谢谢!
我们可以使用 lapply
和 gsub
来完成这个。 grepl
returns 如果模式匹配则为 true 或 false,而 gsub
允许您用其他内容替换匹配项。请注意,您可以轻松地指定 NA
,而不是指定空字符串 (''
),但这取决于您对“空白”的定义。
这里我使用基本 R 的 lapply
,在这种情况下等同于 purrr::map
(甚至语法在这里可以互换)。
data <- lapply(df_list, function(x) {
x %>%
mutate(across(where(is.character), ~gsub('\[\]', '', .x)))
})
[[1]]
first_column second_column
1 1 value1
2 2 value2
3 3
4 4 [value]
[[2]]
first_column_2 second_column_2
1 5 value1
2 6
3 7
4 8 [value2]
[[3]]
first_column_3 second_column_3
1 9
2 10 [value2]
3 11
4 12
您遇到了一些问题:
- (a) 你说你想用
""
替换"[]"
,但你的代码试图完全删除它们,而不是替换它们。使用sub
而不是grepl
进行替换——甚至更好,因为您匹配的是整个字符串,根本不要使用正则表达式 - (b) 你在数字 2 上 运行
grepl
:你有var <- 2
并且你的命令是grepl("[[]",var)
,也就是grepl("[[]", 2)
,这总是FALSE
因为字符串“2”不包含方括号。 - (c) 您的
grepl
模式正在搜索其中包含[
的任何字符串。因此,如果您更正 (a) 和 (b),您仍然会匹配"[value1]"
. 这样的字符串
正如我在 (a) 中所说的,当您匹配一个完整的字符串时,您根本不需要正则表达式。我会这样做:
df_list <- map(df_list, ~ {
.x[[var]][.x[[var]] == "[]"] = ""
.x
})
df_list
# [[1]]
# first_column second_column
# 1 1 value1
# 2 2 value2
# 3 3
# 4 4 [value]
#
# [[2]]
# first_column_2 second_column_2
# 1 5 value1
# 2 6
# 3 7
# 4 8 [value2]
#
# [[3]]
# first_column_3 second_column_3
# 1 9
# 2 10 [value2]
# 3 11
# 4 12