Получить элемент из вектора с его атрибутом в R

gregexpr возвращает список, содержащий вектор с некоторыми дополнительными данными:

[[1]]
[1]  21 136 409 512 587 693
attr(,"match.length")
[1] 3 4 5 5 4 9

Как извлечь сразу только один элемент с соответствующим атрибутом?

[[1]]
[1] 409
attr(,"match.length")
[1] 5

UPD: Конечный объект должен быть совместим с функцией regmatches.

Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
0
0
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Мы можем сделать

out <- lapply(lst1, `[`, 3)
attr(out, "match.length") <- attr(lst1, "match.length")[3]

-вывод

> out
[[1]]
[1] 409

attr(,"match.length")
[1] 5

данные

lst1 <- structure(list(c(21, 136, 409, 512, 587, 693)),
 match.length = c(3, 
4, 5, 5, 4, 9))

Боюсь, lst1 — это не тот объект с той же структурой, который возвращает gregexpr. Его нельзя использовать с функцией regmatches.

Deeproad 21.11.2022 07:39

Одно отличие состоит в том, что gregexpr помещает атрибут в элементы списка, а не в сам список.

user2554330 21.11.2022 11:45
Ответ принят как подходящий

В общем, R не может узнать, что элементы вектора соответствуют 1-1 элементам одного из его атрибутов.

Если вы знаете, что это правда (как в случае с результатами gregexpr), то способ сообщить R об этом — установить класс для объекта и написать свой собственный код подмножества. Например,

`[.gregexpr_result` <- function(x, i) {
  attrs <- lapply(x, function(element) {
    allattrs <- attributes(element)
    allattrs[["match.length"]] <- allattrs[["match.length"]][i]
    allattrs
  })
  x <- lapply(x, `[`, i)
  for (j in seq_along(x))
    attributes(x[[j]]) <- attrs[[j]]
  x
}

x <- paste(letters[1:2], letters[1:2])
result <- gregexpr("b", x)
class(result) <- "gregexpr_result"
result
#> [[1]]
#> [1] -1
#> attr(,"match.length")
#> [1] -1
#> attr(,"index.type")
#> [1] "chars"
#> attr(,"useBytes")
#> [1] TRUE
#> 
#> [[2]]
#> [1] 1 3
#> attr(,"match.length")
#> [1] 1 1
#> attr(,"index.type")
#> [1] "chars"
#> attr(,"useBytes")
#> [1] TRUE
#> 
#> attr(,"class")
#> [1] "gregexpr_result"
result[2]
#> [[1]]
#> [1] NA
#> attr(,"match.length")
#> [1] NA
#> attr(,"index.type")
#> [1] "chars"
#> attr(,"useBytes")
#> [1] TRUE
#> 
#> [[2]]
#> [1] 3
#> attr(,"match.length")
#> [1] 1
#> attr(,"index.type")
#> [1] "chars"
#> attr(,"useBytes")
#> [1] TRUE

Created on 2022-11-20 with reprex v2.0.2

Спасибо. Где узнать больше о синтаксисе вроде `[.gregexpr_result` <- ?

Deeproad 21.11.2022 06:19

Честно говоря, у меня есть небольшое представление о том, что происходит в приведенном выше коде...

Deeproad 21.11.2022 06:44

Вы можете прочитать об этом в «Определении языка R», раздел 5.4, но многие люди находят это руководство непрозрачным и считают «Расширенный R» Хэдли Уикхема более понятным. См. adv-r.hadley.nz/s3.html.

user2554330 21.11.2022 11:41

Если вы прочитаете книгу Advanced R полностью, вы, вероятно, поймете код, но более быстрое решение — перестать читать мой ответ после первого абзаца. То, что вы хотите сделать, трудно.

user2554330 21.11.2022 11:42

Другие вопросы по теме