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),])

谢谢!

我们可以使用 lapplygsub 来完成这个。 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