Программирование на R: Как работает датафрейм $ column [<boolean>] = <value>? - PullRequest
0 голосов
/ 28 мая 2018

Это

df = data.frame(c(-2,-1,1,2), NA)
colnames(df) <- c("values", "pos_neg")
flag <- with(df, values < 0)
df$pos_neg[flag] = "negative"
df$pos_neg[!flag] = "positive"

дает мне это

enter image description here

И все работает как задумано.Проблема в том, что я не совсем уверен, как и почему это происходит.Что будет, если в скобках указать логическое значение?До сих пор я думал, что фрейм данных - это массив, и я могу получить доступ к значениям только по номеру (df[1]) или по имени, если доступно (df["pants"]).

Заранее спасибо!

1 Ответ

0 голосов
/ 28 мая 2018

Немного легче увидеть, если вы посмотрите на подмножество после того, как значения не все 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], работает как [в списке, подстановка столбцов по имени, индексу или логической маске и всегда возвращение другого списка того же класса (т. е. другого фрейма данных).

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