[英]R using grepl across multiple dataframes in a list
我有一個數據框列表,每個數據框都包含多個相同的列。 在其中一列中,有多個實例其中一行僅包含“[]”。 我的目標是用空白替換這些實例。
我試圖通過 map function 和 grepl 這樣做。 當它運行時,output 沒有變化。我在這里的方向正確嗎?
請注意我區分了“[]”和“[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
返回 true 或 false,而gsub
允許您用其他內容替換匹配項。 請注意,您可以輕松指定NA
而不是指定空字符串 ( ''
),但這將取決於您對“空白”的定義。
在這里,我使用 base 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
你有幾個問題:
"[]"
""
但你的代碼試圖完全刪除它們,而不是替換它們。 使用sub
而不是grepl
進行替換——或者更好,因為你匹配的是整個字符串,根本不要使用正則表達式grepl
:您有var <- 2
並且您的命令是grepl("[[]",var)
,即grepl("[[]", 2)
,它始終為FALSE
因為字符串“2”不包含方括號。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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.