Немного легче увидеть, если вы посмотрите на подмножество после того, как значения не все NA
:
df <- data.frame(values = c(-2,-1,1,2),
pos_neg = NA)
flag <- df$values < 0
df$pos_neg[flag] <- "negative"
df$pos_neg[!flag] <- "positive"
Первая важная концепция здесь состоит в том, что фрейм данных представляет собой список (скласс, некоторые ограничения и множество методов, но все же список) переменных («столбцов»), а не двумерный массив (матрица).Таким образом, подмножество $
или [[
извлекает одну переменную, которая является единственным вектором, поэтому
df$pos_neg
#> [1] "negative" "negative" "positive" "positive"
Вы можете подмножество любого вектора логическим вектором, поэтому логическое подмножество работает так же, как c('a', 'b')[c(FALSE TRUE)]
делает:
df$pos_neg[flag]
#> [1] "negative" "negative"
df$pos_neg[!flag]
#> [1] "positive" "positive"
Использование <-
для назначения этим подмножествам работает здесь, потому что вы предоставляете вектор длины 1, который перерабатывается для подмножества.
Использование подмножества [
с двумя параметрами (для строк и столбцов) во фрейме данных, например, df[2:3, 'values']
, в некоторых отношениях более сложное, даже если оно более интуитивно понятно из матричного аналога.В частности, метод [.data.frame
по умолчанию равен drop = TRUE
, что может сделать неясным, будет ли он возвращать другой фрейм данных или вектор.В большинстве случаев это не имеет значения, но может привести к ошибкам при программном использовании.
Использование [
поднабора с одним параметром во фрейме данных, например, df[1]
, работает как [
в списке, подстановка столбцов по имени, индексу или логической маске и всегда возвращение другого списка того же класса (т. е. другого фрейма данных).