Неожиданное поведение при индексировании data.frame по имени строки

Я не часто использую индексирование data.frame по имени строки, но иногда есть преимущество. Тем не менее, я заметил неожиданный результат, когда попытался фильтровать нечеткую строку

  test <- data.frame(a = c("a", "b", "c"), 
                     b = c("A", "B", "C"), 
                     row.names = c(-99.5, 99.5, 99))
  test["-99", ]

Вы ожидаете, что это даст вам

     a    b
NA <NA> <NA>

но он возвращает

      a b
-99.5 a A

Просто, чтобы быть конкретным

Session info ---------------------------------------------------------------
 setting  value                       
 version  R version 3.2.1 (2015-06-18)
 system   x86_64, mingw32             
 ui       RStudio (0.99.441)          
 language (EN)                        
 collate  English_United Kingdom.1252 
 tz       Europe/London  

Любые идеи?

Ответ 1

Это действительно неожиданно.

Ответ на это заключается в частичном сопоставлении имен строк при индексировании:

mtcars["Val", ]

Дайте нам строку "Valient". Это не работает для столбцов:

mtcars[ ,"cy"]

Чтобы устранить это, я бы подмножество, используя:

subset(test, rownames(test) == "-99")

Изменить: оно действительно задокументировано в ?"[.data.frame"

Оба [и [[методы извлечения частично соответствуют именам строк). По умолчанию ни частично не совпадают имена столбцов, но [[будет, если точно = FALSE (и с предупреждением, если точное = NA). Если вы хотите, чтобы имена строк используют совпадение, как в примерах.

Чтобы использовать совпадение с вашими данными:

test[match("-99", row.names(test)), ]