В вашем случае 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.