R - Фильтр списка, используя первый элемент каждого элемента в списке - PullRequest
4 голосов
/ 27 февраля 2020

Я довольно плохо знаком с R и пытаюсь проанализировать данные из PDF в таблицу данных. Я смог разобрать текст в список, но мне трудно пытаться отфильтровать данные из списка.

В качестве примера рассмотрим приведенный ниже примерный список:

l_vectors <- list( c("K", "10", "20"),
                   c("1", "30", "40"),
                   c("a", "b", "c"),
                   c("x", "y", "z"))

Допустим, я бы хотел отфильтровать этот список, чтобы он включал в себя только векторы, начинающиеся с "K" или "1"

Я могу использовать map_lgl, чтобы найти, получить логический вектор, указывающий, какие элементы списка являются матч

map_lgl(l_vectors, function(x) x[1] == "K" | x[1] == "1" )
[1]  TRUE  TRUE FALSE FALSE

Слышу, я не совсем уверен, в каком направлении. Я предполагаю, что я хотел бы использовать этот логический вектор в сочетании с pluck, но не могу понять это. Любая помощь будет оценена!

Ура, Джонатон

Ответы [ 2 ]

2 голосов
/ 27 февраля 2020

Если вы хотите использовать baseR, вы можете написать вспомогательную функцию, а затем использовать Filter

f <- function(x) x[1] %in% c("K", "1")
Filter(f, l_vectors)
#[[1]]
#[1] "K"  "10" "20"

#[[2]]
#[1] "1"  "30" "40"

Это также можно записать как

Filter(function(x) x[1] %in% c("K", "1"), l_vectors)
1 голос
/ 27 февраля 2020

Опция от keep до l oop над list из vector с и создание логического вектора длины 1 с str_detect, обернутым с any. Здесь проверяемый шаблон - это символ «K» или (|) «1» от начала (^) строки

library(purrr)
library(stringr)
keep(l_vectors, ~ any(str_detect(.x, "^(K|1)")))
#[[1]]
#[1] "K"  "10" "20"

#[[2]]
#[1] "1"  "30" "40"

Если мы проверяем только первый элемент, нет необходимости any для переноса

keep(l_vectors, ~ str_detect(.x[1], "^(K|1)"))
#[[1]]
#[1] "K"  "10" "20"

#[[2]]
#[1] "1"  "30" "40"

Если это фиксированное совпадение, то, как и в посте @markus, можно использовать %in%

keep(l_vectors,  ~ .x[1] %in% c("K", "1"))
...