当从数据框中检索不存在的行名时,为什么 R 会表现出不一致的行为?

foe*_*ehn 7 r dataframe r-rownames

我想知道为什么当检索不存在的行名时两个数据框会产生不同的结果ab例如,

a <- as.data.frame(matrix(1:3, ncol = 1, nrow = 3, dimnames = list(c("A1", "A10", "B"), "V1")))
a
    V1
A1   1
A10  2
B    3

b <- as.data.frame(matrix(4:5, ncol = 1, nrow = 2, dimnames = list(c("A10", "B"), "V1")))
b
    V1
A10  4
B    5
Run Code Online (Sandbox Code Playgroud)

让我们尝试从数据框中获取“A10”、“A1”、“A” a

> a["A10", 1]
[1] 2
> a["A1", 1]
[1] 1                    # expected
> a["A", 1]
[1] NA                   # expected
> a["B", 1]
[1] 3                    # expected
> a["C", 1]
[1] NA                   # expected
Run Code Online (Sandbox Code Playgroud)

让我们对数据框做同样的事情b

> b["A10", 1]
[1] 4
> b["A1", 1]
[1] 4                    # unexpected, should be NA
> b["A", 1]              
[1] 4                    # unexpected, should be NA
> b["B", 1]
[1] 5                    # expected
> b["C", 1]
[1] NA                   # expected
Run Code Online (Sandbox Code Playgroud)

现在a["A", 1]返回了NA,为什么返回b["A", 1]b["A1", 1]不返回?

附言。R版本3.5.2

Mik*_*gan 3

在这里综合一些评论......


?`[`说:

与 S(Becker等人,第 358 页)不同,R 在通过 提取时从不使用部分匹配[,并且默认情况下不使用部分匹配[[(参见参数exact)。

?`[.data.frame`说:

[和提取方法都[[部分匹配行名称。默认情况下,两者都不会部分匹配列名,但[[会 if exact = FALSE(并带有警告 if exact = NA)。如果您想精确匹配行名称,请使用match,如示例中所示。

给出的例子是:

sw <- swiss[1:5, 1:4]
sw["C", ]
##            Fertility Agriculture Examination Education
## Courtelary      80.2          17          15        12

sw[match("C", row.names(sw)), ]
##    Fertility Agriculture Examination Education
## NA        NA          NA          NA        NA
Run Code Online (Sandbox Code Playgroud)

同时:

as.matrix(sw)["C", ]
## Error in as.matrix(sw)["C", ] : subscript out of bounds
Run Code Online (Sandbox Code Playgroud)

因此,矩阵的行名称完全匹配,而数据帧的行名称部分匹配,并且这两种行为都被记录下来。

[.data.frame是用 R 而不是 C 实现的,因此您可以通过打印函数来检查源代码。部分匹配发生在这里:

    if (is.character(i)) {
        rows <- attr(xx, "row.names")
        i <- pmatch(i, rows, duplicates.ok = TRUE)
    }
Run Code Online (Sandbox Code Playgroud)

最近Bugzilla 上有一个关于数据框行名称部分匹配的主题。(还没有讨论...)

令人惊讶的是,它与字符索引[.data.frame的行为不匹配。[