Ссылка на список объектов с тем же именем - PullRequest
1 голос
/ 02 октября 2019

При работе с данными XML (библиографическими) я преобразовал теги в список с помощью команды xmlToList. Проблема в том, что есть несколько элементов с одинаковым тегом, которые отображаются как элементы списка с одинаковыми именами, скажем, у соавтора будет два идентичных тега, которые станут двумя одинаковыми именами объектов списка, такими как $ rec $ stuff $ record $ author. Например:

Предположим, список называется A1:

$`rec`$`header`$`controlInfo`$artinfo$aug$au
# [1] "Smith, Bob"

$`rec`$`header`$`controlInfo`$artinfo$aug$au
# [1] "Jones, Mike"
A1$`rec`$`header`$`controlInfo`$artinfo$aug$au

всегда означает «Смит, Боб».

Кажется, я не могу найти очевидный способ сослаться на вторую запись, "Джонс, Майк", без переименования элементов списка (по другим причинам, кроме анализа данных, я бы предпочел этого не делать). Кроме того, мне нужно было бы иметь возможность назначить NA на второе место, если нет второго элемента с таким же именем, если это возможно. Есть ли способ сделать это?

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 02 октября 2019

Вы можете индексировать список в R, используя двойные скобки (см. Как индексировать элемент объекта списка в R ). Попробуйте это:

> rec = list()
> rec
list()
> rec$x = "first"
> rec
$x
[1] "first"

> rec2 = c(rec,rec)
> rec2
$x
[1] "first"

$x
[1] "first"

> rec2$x = "second"
> rec2
$x
[1] "second"

$x
[1] "first"

> rec2[[1]]
[1] "second"
> rec2[[2]]
[1] "first"
> rec2[[2]] = "third"

> rec2
$x
[1] "second"

$x
[1] "third"
1 голос
/ 02 октября 2019

В идеале имена должны быть уникальными, чтобы избежать этой точной проблемы. Однако, если у вас есть похожие имена, вы можете получить все элементы с похожими именами, сравнив имена с ==.

Рассмотрим этот пример, где имя a1 повторяется

lst <- list(a = list(a1 = 1, a1 = 2, b1 = 1))
lst

#$a
#$a$a1
#[1] 1

#$a$a1
#[1] 2

#$a$b1
#[1] 1

lst$a$a1 вернет только первую запись a1, чтобы получить все элементы с одинаковым именем (a1) мы можем сравнить names

lst$a[names(lst$a) == "a1"]
#$a1
#[1] 1

#$a1
#[1] 2

и теперь, скажем, мы хотим изменить второе a1 на 20, которое мы можем затем сделать

lst$a[names(lst$a) == "a1"][[2]] <- 20

#$a
#$a$a1
#[1] 1

#$a$a1
#[1] 20

#$a$b1
#[1] 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...