引用具有相同名称的列表对象

时间:2019-10-02 00:52:58

标签: r

在处理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

始终是“史密斯,鲍勃”。

在不重命名列表元素的情况下,我似乎找不到一种明显的方式来引用第二个条目“ Jones,Mike”(出于解析数据以外的其他原因,我宁愿不这样做)。另外,如果可能的话,如果没有第二个元素具有相同的名称,我需要能够将NA分配给第二个位置。有办法吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用双括号将R中的列表编入索引(请参见How to index an element of a list object in 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 :(得分:1)

理想情况下,名称应唯一以避免此确切问题。但是,如果您使用相似的名称,则可以通过将名称与==进行比较来获得所有具有相似名称的元素。

考虑此示例,其中重复了名称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