我想知道為什么兩個資料幀在檢索到不存在的行名時會產生不同的結果a。b例如,
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
讓我們嘗試從資料框中獲取“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
讓我們對資料框做同樣的事情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
現在a["A", 1]回傳,NA為什么回傳?b["A", 1]b["A1", 1]
PS。R 版本 3.5.2
uj5u.com熱心網友回復:
在這里綜合一些評論......
?`[` 說:
與 S (Becker et al p. 358) 不同,R 在提取 by 時從不使用部分匹配
[,并且默認情況下不使用部分匹配[[(參見引數exact)。
但是?`[.data.frame`說:
[和提取方法都[[部分匹配行名。默認情況下,既不部分匹配列名,但[[會 ifexact = FALSE(并帶有警告 ifexact = 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
同時:
as.matrix(sw)["C", ]
## Error in as.matrix(sw)["C", ] : subscript out of bounds
因此,矩陣的行名完全匹配,而資料幀的行名部分匹配,并且記錄了這兩種行為。
[.data.frame是在 R 中實作的,而不是 C,因此您可以通過列印函式來檢查源代碼。部分匹配發生在這里:
if (is.character(i)) {
rows <- attr(xx, "row.names")
i <- pmatch(i, rows, duplicates.ok = TRUE)
}
Bugzilla 上恰好有一個關于資料幀行名部分匹配的帖子。(還沒有討論...)
與字符索引[.data.frame的行為不匹配絕對令人驚訝。[
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/412455.html
標籤:
