#r #dataframe
#r #фрейм данных
Вопрос:
Я помещаю имена столбцов в список, а затем хочу выбрать эти столбцы из фрейма данных. Я использую следующий код
features <- list(c("Weeks"), c("Weeks","Age"))
X = train_linear[,as.character(features[1])] # working fine
X = train_linear[,as.character(features[2])]
Последняя строка выдает следующую ошибку.
Error in `[.data.frame`(train_linear, , as.character(features[2])): undefined columns selected
Traceback:
1. train_linear[, as.character(features[2])]
2. `[.data.frame`(train_linear, , as.character(features[2]))
3. stop("undefined columns selected")
Это заняло много времени, но я ничего не нашел по этому поводу. Вместо списка, если я сделаю это,
X = train_linear[,c("Weeks","Age")]
Тогда он работает отлично. Но мне нужно создать несколько комбинаций столбцов, и в этом случае список — лучший вариант для меня.
Ответ №1:
Нам нужно unlist
, если это [
так, или напрямую получить list
элемент с [[
train_linear[, features[[2]]]
Нет необходимости использовать as.character
, поскольку это уже строка.
Проблема связана с вводом as.character
. Когда в list
features[1]
#[[1]] # // still a list with one element
#[1] "Weeks"
as.character(features[1]) # // coerces to vector as it calls as.vector
#[1] "Weeks"
as.character(features[2]) # // note the added double quotes
#[1] "c("Weeks", "Age")"
и теперь это одна строка вместо двух элементов, потому что она объединяется путем вызова paste
length(as.character(features[2]))
#[1] 1
тогда как, если мы используем [[
, он возвращает vector
features[[2]]
#[1] "Weeks" "Age"
features[[1]]
#[1] "Weeks"
is.vector(features[[2]])
#[1] TRUE
is.list(features[2])
#[1] TRUE
is.list(features[[2]])
#[1] FALSE
Что касается комментария о том, почему выбор одного столбца возвращает a vector
, это связано с особенностью data.frame
того, где ?Extract
по умолчанию drop = TRUE
.
x[i, j, … , drop = TRUE]
т. е. на основе использования страницы справки Extract, когда есть один столбец, строка, он преобразуется в вектор. Если нам нужно использовать ,
для разделения строки, индекс столбца, то нам drop = FALSE
также нужно указать или иным образом просто указать индекс столбца или имена без запятой
train_linear[, features[[1]], drop = FALSE]
Или
train_linear[features[[1]]]
Комментарии:
1. Кстати, выбор одного столбца не дает фрейма данных. Выбор нескольких столбцов возвращает фрейм данных.
2. Понял. Но теперь вместо индексации объектов [[1]] я перебираю переменную «features» и делаю это как «X = train_linear [,feature]» Итак, я должен поставить условие, если длина равна 1, затем используйте drop= FALSE в противном случае нормально.
3. Перебор столбцов объектов был слишком простым, я должен был сделать это раньше.
4. @HammadHassan Вы всегда можете добавить
drop = FALSE
или без,
условия вместо условия if / else. Я бы не стал создавать дополнительные условия в коде, если это не является абсолютно необходимым