Очевидный ответ: , не делайте поднаборов таким образом !Используйте соответствующие инструменты.Что не так с
spyPr2.new <- spyPr2[, c("Date", "Close", "Adj.Close")]
?
Чтобы объяснить поведение, которое вы видите, вам необходимо понять, что возвращает $
и как работает cbind()
.cbind()
- это одна из странностей в R, в которой отправка метода не осуществляется обычным методом, а вместо этого обрабатывается специальным кодом, скрытым во внутреннем пространстве R. Это весь код R, стоящий за cbind()
:
> cbind
function (..., deparse.level = 1)
.Internal(cbind(deparse.level, ...))
<bytecode: 0x24fa0c0>
<environment: namespace:base>
Не так много помощи, а?Однако существуют методы для фреймов данных и "ts"
объектов:
> methods(cbind)
[1] cbind.data.frame cbind.ts*
Non-visible functions are asterisked
Прежде чем я сделаю раскрытие, также обратите внимание, что возвращает $
(dat2
- это ваши 6 строк данных после преобразования Date
на "Date"
объект):
> str(dat2$Date)
Date[1:6], format: "2011-12-30" "2011-12-29" "2011-12-28" "2011-12-27" ...
Это "Date"
объект, который действительно является особым вектором.
> class(dat2$Date)
[1] "Date"
Главное, что это не фрейм данных.Поэтому, когда вы используете cbind()
, внутренний код видит три вектора, а внутренний код создает матрицу.
> (c1 <- cbind(dat2$Date, dat2$Close, dat2$Adj.Close))
[,1] [,2] [,3]
[1,] 15338 125.50 125.50
[2,] 15337 126.12 126.12
[3,] 15336 124.83 124.83
[4,] 15335 126.49 126.49
[5,] 15331 126.39 126.39
[6,] 15330 125.27 125.27
> class(c1)
[1] "matrix"
В R могут быть только числовые или символьные матрицы, поэтому объект Date
преобразуетсяк числовому вектору:
> as.numeric(dat2$Date)
[1] 15338 15337 15336 15335 15331 15330
, чтобы cbind()
мог создать числовую матрицу.
Вы можете принудительно использовать метод фрейма данных, вызывая его явно, и он знает, какдля обработки "Date"
объектов и т. д. не выполняет никакого преобразования:
> cbind.data.frame(dat2$Date, dat2$Close, dat2$Adj.Close)
dat2$Date dat2$Close dat2$Adj.Close
1 2011-12-30 125.50 125.50
2 2011-12-29 126.12 126.12
3 2011-12-28 124.83 124.83
4 2011-12-27 126.49 126.49
5 2011-12-23 126.39 126.39
6 2011-12-22 125.27 125.27
Однако, за исключением всего объяснения, вы пытаетесь выполнить подмножество очень сложным способом.[
как функция подмножества работает просто отлично:
> dat2[, c("Date", "Close", "Adj.Close")]
Date Close Adj.Close
1 2011-12-30 125.50 125.50
2 2011-12-29 126.12 126.12
3 2011-12-28 124.83 124.83
4 2011-12-27 126.49 126.49
5 2011-12-23 126.39 126.39
6 2011-12-22 125.27 125.27
subset()
также является опцией, но здесь не требуется:
> subset(dat2, select = c("Date", "Close", "Adj.Close"))
Date Close Adj.Close
1 2011-12-30 125.50 125.50
2 2011-12-29 126.12 126.12
3 2011-12-28 124.83 124.83
4 2011-12-27 126.49 126.49
5 2011-12-23 126.39 126.39
6 2011-12-22 125.27 125.27