Значение комбинированных обозначений [,] и $ - PullRequest
0 голосов
/ 21 октября 2018

Я понимаю, что запись [ , ] извлекает значения из фрейма данных в виде [row #, column #].Я также знаю, что нотация $ возвращает все значения в столбце как вектор, но я не уверен, как эти 2 нотации соединены вместе.

РЕДАКТИРОВАТЬ:

Дополнительный контекст / пример: mydat[mydat$obsnum == 1,]

Ответы [ 3 ]

0 голосов
/ 21 октября 2018

Предположим, mydat - это фрейм данных с n строками.Затем mydat$obsnum == 1 создает логический вектор длины n, каждый элемент которого равен TRUE, если соответствующий элемент mydat$obsnum равен 1, и FALSE в противном случае.

Подмножество типа mydat[1, ] дает вам первую строку mydat.Но вы также можете использовать подмножество, используя логический вектор;вы получите все строки, где логический вектор равен TRUE.

Итак, mydat[mydat$obsnum == 1, ] даст вам все строки mydat, где mydat$obsnum равно 1.

0 голосов
/ 21 октября 2018

Значение:

mydat[mydat$obsnum == 1,]

является простым, если вы разложите выражение на следующие эквивалентные 3 строки:

X <- mydat$obsnum
Y <- X == 1
mydat[Y,]

Итак, как вы правильно сказали:

X <- mydat$obsnum

возвращает вектор целых чисел (я предполагаю количество наблюдений)

Затем:

Y <- X == 1

возвращает логический вектор например c(TRUE,FALSE,TRUE...),такой же длины X с TRUE, где X равен 1 и FALSE в другом месте.

Наконец:

mydat[Y,]

выбирает строки mydatгде Y равно TRUE и исключает строки, где Y равно FALSE.

Фактически, оператор подмножества data.frame [,] принимает либо целочисленные векторы, содержащие индексы строк / столбцов, либологические векторы, указывающие, какие строки / столбцы должны быть извлечены, или даже символьные векторы, указывающие имена строк / столбцов, которые должны быть выбраны.

0 голосов
/ 21 октября 2018

В вашем случае idx <- mydat$obsnum == 1 генерирует логический вектор idx.Теперь, если idx[1] == TRUE, это означает, что предикат, который вы использовали для генерации вектора, оценивается как TRUE для первого элемента.То же самое относится к значению, например, idx[3] == FALSE, только в том случае, если предикат не был достигнут.

Ваш логический вектор может затем использоваться для индексации в кадре данных.Итак, что вы на самом деле делаете, это: mydat[c(TRUE, TRUE, FALSE, TRUE, FALSE), ], только то, что вы никогда не писали этот индекс-вектор вручную.

Как вы правильно заметили, примечание [] также можно использовать для выбора столбцов вваш фрейм данныхНапример, вы можете захотеть выбрать только первый столбец: mydat[c(TRUE, TRUE, FALSE, TRUE, FALSE), 1].

Теперь, замечательно, что логическое индексирование также работает для столбцов!Можете ли вы угадать, что делает mydat[c(TRUE, TRUE, FALSE, TRUE, FALSE), c(TRUE, FALSE)]?Именно так!Возвращает первый, но не второй столбец!То есть, если в кадре данных ровно два столбца, в противном случае вектор будет переработан в соответствии с length(colnames(df)).

Возвращаясь к вводному примеру mydat[mydat$obsnum == 1,], будут выбраны все строкигде предикат содержит и все столбцы.Если вы выполнили mydat[mydat$obsnum == 1, mydat$obsnum == 1], все, что происходит, это то, что R генерирует два логических вектора и использует их для индексации кадра данных, он ничего не знает о семантике этого предиката.

Редактировать: кроме indexвекторы , вы также можете иметь индексные матрицы .Вы также обнаружите, что эта функция появилась в Pandas , библиотеке анализа данных для Python.

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