R Перебирать столбцы фрейма данных из списка, ошибка: выбраны неопределенные столбцы

#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. Я бы не стал создавать дополнительные условия в коде, если это не является абсолютно необходимым