Аналогично этому вопросу, но для индекса столбца, а не строки: Как найти индекс строки, содержащей определенную частичную строку?
Я собираю данные из PDF-файлов, и таблицы на разных страницах содержат одинаковую информацию в разном выравнивании. Часть информации «А» может находиться в столбце 2 строки 3 таблицы A и столбце 1 строки 4 таблицы B.
Как указано выше, мы можем получить индекс строки, используя:
df <- data.frame(
v1 = c("a", "b", "c", "d", "e"),
v2 = c("x", "y", "a", "z", "f"),
v3 = c("x", "y", "a", "z", "s"),
v4 = c("w", "c", "q", "p", "r")
)
library(tidyverse)
df %>%
mutate(ind = row_number()) %>%
filter(if_any(everything(), ~ str_detect(., 'a'))) %>%
pull(ind)
# [1] 1 3
Но в моем (по общему признанию, очень необычном) случае, когда я не знаю столбец, как я могу получить индекс столбца (например, при поиске «а» в приведенном выше примере должно быть 1, 2, 3)?





Базовое решение R с использованием colSums :
search_term <- "a"
which(colSums(df == search_term) > 0)
#v1 v2 v3
# 1 2 3
Приведенное выше дает точное совпадение с использованием ==. Если вы ищете частичное совпадение, вы можете использовать grepl.
which(colSums(sapply(df, grepl, pattern = search_term)) > 0)
Сохраняйте исходный подход с помощью dplyr и t.
library(dplyr)
tibble(t(df)) %>%
reframe(row_number()[rowSums(across(everything(), ~ .x == "a")) > 0]) %>%
unlist(use.names=F)
[1] 1 2 3
И база which
df <- data.frame(
v1 = c("a", "b", "c", "d", "e"),
v2 = c("x", "y", "a", "z", "f"),
v3 = c("x", "y", "a", "z", "s"),
v4 = c("w", "c", "q", "p", "r")
)
which(df == 'a', arr.ind = TRUE)[,2]
[1] 1 2 3
это также предоставит строки, если это необходимо.