В чем разница в cbind при использовании с индексом по сравнению с именем переменной

Используя набор данных радужной оболочки глаза для этого примера, многие люди это знают.

Я масштабировал первые 4 переменные набора данных и назвал их scaled.iris. standardized.iris <- scale(iris[,-5])Почему есть разница, привязываю ли я столбец по индексу cbind(scaled.iris,iris[5])или по имени переменной cbind(scaled.iris,iris$Species)?

Первый дает мне data.frame со столбцом с фактическими метками ("setosa","versicolor",...) плюс правильное имя столбца, последний дает мне матрицу без имени столбца плюс символьные значения 1-3.

1 ответ

Решение

Это связано с классом вызываемого объекта. Это не имеет ничего общего сcbind().

Когда столбец выбирается из фрейма данных с использованием номера столбца, выбранный столбец извлекается как фрейм данных. Если вызывается один столбец, извлеченный объект будет фреймом данных с одним столбцом. Если вызывается более одного столбца, то извлеченный объект будет фреймом данных со всеми вызванными столбцами.

Когда столбец выбирается с использованием имени столбца, выбранный столбец извлекается как вектор без имени. Если вызывается один столбец, извлеченный объект будет одним вектором. Если вызывается более одного столбца, то извлеченный объект будет вектором из числа вызванных векторов.

Если вы запустите str(), вы можете найти разницу.

> str(iris[1])
'data.frame':   150 obs. of  1 variable:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...

> str(iris$Sepal.Length)
 num [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...

Вы могли видеть, что класс первого - data.frame, состоящий из числового вектора, а класс второго - числовой.

Другие вопросы по тегам