Странный случай с таблицами данных в R, имена столбцов смешаны - PullRequest
0 голосов
/ 27 декабря 2018

Итак, я создал эту переменную с именем mc_split_device внутри таблицы данных с именем mc_with_devices.Однако, если я наберу mc_with_devices$mc_split, я получу значения столбца mc_split_device, хотя никогда не создавал переменную с именем mc_split.

enter image description here

Ответы [ 3 ]

0 голосов
/ 27 декабря 2018

Частично совпадает с именем столбца.Из ?Extract

имен: Для извлечения это обычно (см. «Среды») частично соответствует именам объекта.

В некоторых случаях индексы символов могут бытьчастично соответствует (см. pmatch) именам или димам поднабора объектов

Таким образом, по умолчанию используется частичное сопоставление только при извлечении из рекурсивных объектов (кроме сред) на $.

Следовательно, когда вы делаете

mtcars$m

Вы получаете

#[1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4 10.4
#[17] 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7 15.0 21.4

, что совпадает с mtcars$mpg

Это может иногда сбивать с толку, и если вы хотитечтобы быть уведомленным, когда такое частичное соответствие сделано.Вы можете включить предупреждение с помощью

options(warnPartialMatchDollar = TRUE)
mtcars$m
# [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4 10.4
#[17] 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7 15.0 21.4

Предупреждающее сообщение: In $.data.frame (mtcars, m): частичное совпадение 'm' с 'mpg' во фрейме данных

0 голосов
/ 24 июня 2019

В соответствии с ?Extract

name - буквенная строка символов или имя (возможно, обратная кавычка).Для извлечения это обычно (см. В разделе «Среды») частично совпадает с именами объекта.

и exact

точный - Управляет возможным частичным соответствиемof [[при извлечении по символьному вектору (для большинства объектов, но см. «Среды»).По умолчанию частичное совпадение отсутствует.Значение NA допускает частичное совпадение, но выдает предупреждение, когда это происходит.Значение FALSE позволяет выполнять частичное сопоставление без каких-либо предупреждений.

Итак, когда мы делаем

mtcars$m
#[1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3
#[27] 26.0 30.4 15.8 19.7 15.0 21.4

mtcars$d
#NULL

Поскольку существует несколько имен, начинающихся с 'd'

 names(mtcars)
 #[1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear" "carb"

Если мы конкретизируем, он выполняет частичное совпадение для столбца 'disp'

mtcars$di
#[1] 160.0 160.0 108.0 258.0 360.0 225.0 360.0 146.7 140.8 167.6 167.6 275.8 275.8 275.8 472.0 460.0 440.0  78.7  75.7  71.1 120.1
#[22] 318.0 304.0 350.0 400.0  79.0 120.3  95.1 351.0 145.0 301.0 121.0
0 голосов
/ 27 декабря 2018

См. Advanced Hadley Wickham's R :

$ - это сокращенный оператор, где x $ y эквивалентно x [["y", точный = FALSE]].Он часто используется для доступа к переменным во фрейме данных, как в mtcars $ cyl или diamonds $ carat.

Так что exact=FALSE является причиной, по которой $mc_split работает, несмотря на отсутствие столбца сэто точное имя.

Кстати, я не верю, что mc_with_devices[,.(mc_split)] будет работать без двойных кавычек.Будет работать следующее:

mc_with_devices[,"mc_split_resp"]

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