2

我有一个大约有 20 000 行和 215 列的数据框,需要搜索,其中出现了某些关键字(如果存在)。

有很多关于指定列中部分匹配的建议,例如

根据列中的部分字符串匹配选择数据框行

唉,这些功能似乎都不允许搜索所有列。一种选择当然是编写几个嵌套循环。

但是,我想知道是否有更有效的方法 == 已经存在的函数来搜索 a) 数据框的所有列(或:列表中的所有列表)?b)并且可能不只搜索一个短语,而是搜索关键字列表?

例如

# some data
Species <- c("Acanthurus dussumieri", "Callionymus maculatus", "Eviota prasina", "Gymnogobius urotaenia", "Kyphosus bigibbus")
Column1 <- c(60.1, 106, 78.6, 21.5, 71)
ColumnEgg <- c(11.2, 14.5, 12, 8, NA)
Add_Info <- c("Spawns when water temperatures reach above 15°C.", NA, "females deposit eggs of 1.5 mm diameter on plants. Larvae hatch after 3-13 days.", NA, "55 cm TL newborn weighs 380 g")
    
df <- data.frame(Species, Column1, ColumnEgg, Add_Info)
df

现在很容易搜索,如果知道在哪一列中查找模式,例如

library(stringr)
library(dplyr)

df%>%
  filter(str_detect(Species,"Aaptosyax"))

但是:如何在所有 column 中搜索短语或关键字列表,例如

df%>%
      filter(str_detect(df[1:4],"Aaptosyax"))

或者

keywords <- c("Aaptosyax", "egg")
df%>%
          filter(str_detect(df[1:4],keywords))

非常感谢您的帮助!

4

4 回答 4

3

使用subset+ grepl+的基本 R 选项rowSums

subset(
  df,
  rowSums(sapply(df, grepl, pattern = "Aaptosyax")) > 0
)
于 2021-08-31T08:04:56.163 回答
2

如果您使用:

grep(pattern = your_pattern, x = your_dataframe)

因此,如果您搜索“planet”一词并且您的数据框名为 my_df ,则:

grep(pattern = "planet", x = my_df)

对于关键字列表,您可以用竖线“|”分隔它们 在模式中:

grep(pattern = "planet|egg", x = my_df)

它将返回模式匹配的所有列。

于 2021-08-31T07:58:24.793 回答
2

使用if_any-

library(dplyr)
library(stringr)

df %>% filter(if_any(1:4, str_detect, "Aaptosyax"))

对于多个关键字,将它们折叠成一个字符串。

keywords <- c("Aaptosyax", "egg")
df %>% filter(if_any(1:4, str_detect, paste0(keywords, collapse = '|')))
于 2021-08-31T08:00:46.950 回答
2

坚持dplyr你可以across用来过滤各种列。

df %>%
 filter(if_any(everything(), ~str_detect(.,keywords))

colwise插图是一个很好的指南https://dplyr.tidyverse.org/articles/colwise.html

于 2021-08-31T08:03:48.050 回答