2014-12-29 1 views
0

я получаю ежемесячно значение цены для двух активов ниже от Yahoo:R dataframe определяют имена столбцов при создании

if(!require("tseries") | !require(its)) { install.packages(c("tseries", 'its')); require("tseries"); require(its) } 
startDate <- as.Date("2000-01-01", format="%Y-%m-%d") 
MSFT.prices = get.hist.quote(instrument="msft", start= startDate, 
           quote="AdjClose", provider="yahoo", origin="1970-01-01", 
           compression="m", retclass="its") 
SP500.prices = get.hist.quote(instrument="^gspc", start=startDate, 
           quote="AdjClose", provider="yahoo", origin="1970-01-01", 
           compression="m", retclass="its") 

Я хочу поставить эти два в один кадр данных с заданным columnames (Панда позволяет это сейчас - немного иронично, поскольку они берут концепцию data.frame из R). Как ниже, Поручаю два временных рядов с именами:

MSFTSP500.prices <- data.frame(msft = MSFT.prices, sp500= SP500.prices) 

Однако это не сохраняет имена столбцов [msft, snp500] Я назначил. Мне нужно, чтобы определить имена столбцов в отдельной строке кода:

colnames(MSFTSP500.prices) <- c("msft", "sp500") 

Я пытался поставить colnames и col.names внутри data.frame() вызова, но он не работает. Как определить имена столбцов при создании фрейма данных?

Я нашел ?data.frame очень бесполезные ...

+0

@BondedDust Это недопустимый код R. –

+0

Извините, исправлено .... –

ответ

2

Код не отображается с сообщением об ошибке, указывающим отсутствие доступности as.its. Поэтому я добавил недостающий код (который, кажется, был успешным после двух неудачных попыток.) ​​Как только вы выпустите отсутствующий вызов require(), вы можете использовать str, чтобы узнать, какой объект get.hist.quote действительно возвращается. Это не является ни dataframe, ни объект зоопарка, хотя он напоминает зоопарк-объект во многих отношениях:

> str(SP500.prices) 
Formal class 'its' [package "its"] with 2 slots 
    [email protected] .Data: num [1:180, 1] 1394 1366 1499 1452 1421 ... 
    .. ..- attr(*, "dimnames")=List of 2 
    .. .. ..$ : chr [1:180] "2000-01-02" "2000-01-31" "2000-02-29" "2000-04-02" ... 
    .. .. ..$ : chr "AdjClose" 
    [email protected] dates: POSIXct[1:180], format: "2000-01-02 16:00:00" "2000-01-31 16:00:00" ... 

Если запустить cbind на этих двух объектах вы получаете регулярную матрицу с dimnames:

> str(cbind(SP500.prices, MSFT.prices) ) 
num [1:180, 1:2] 1394 1366 1499 1452 1421 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : chr [1:180] "2000-01-02" "2000-01-31" "2000-02-29" "2000-04-02" ... 
    ..$ : chr [1:2] "AdjClose" "AdjClose" 

Вам все равно нужно изменить имена столбцов, так как не существует cbind.its, который позволяет назначать имена столбцов. Я хотел бы предостеречь об использовании метода data.frame, так как объект может запутаться в своем поведении:

> str(MSFTSP500.prices) 
'data.frame': 180 obs. of 2 variables: 
$ AdjClose :Formal class 'AsIs', 'its' [package ""] with 1 slot 
    .. [email protected] .S3Class: chr "AsIs" "its" 
$ AdjClose.1:Formal class 'AsIs', 'its' [package ""] with 1 slot 
    .. [email protected] .S3Class: chr "AsIs" "its" 

Колонки еще S4 объекты. Я полагаю, что это может быть полезно, если вы собираетесь передать их другим методам its, но может быть запутанным в противном случае. Это может быть то, что вы снимали:

> MSFTSP500.prices <- data.frame(msft = as.vector(MSFT.prices), 
           sp500= as.vector(SP500.prices) , 
          row.names= as.character([email protected])) 
> str(MSFTSP500.prices) 
'data.frame': 180 obs. of 2 variables: 
$ msft : num 35.1 32 38.1 25 22.4 ... 
$ sp500: num 1394 1366 1499 1452 1421 ... 
> head(rownames(MSFTSP500.prices)) 
[1] "2000-01-02 16:00:00" "2000-01-31 16:00:00" "2000-02-29 16:00:00" 
[4] "2000-04-02 17:00:00" "2000-04-30 17:00:00" "2000-05-31 17:00:00" 
+0

Собственно, если вы не используете 'its', он возвращается к' zoo'. YMMV. – dash2

+0

По-видимому, наш пробег меняется. У меня ошибка. –

1

MSFT.prices зоопарк объект, который, как представляется, данные кадра, так, со своим собственным именем столбца, который будет передан в объект. Confer

tmp <- data.frame(a=1:10) 
b <- data.frame(lost=tmp) 

, который теряет второе название колонки.

Если вы

MSFTSP500.prices <- data.frame(msft = as.vector(MSFT.prices), 
    sp500=as.vector(SP500.prices)) 

, то вы получите COLNAMES вы хотите (хотя вы не получите зоопарки конкретного поведения). Не уверен, почему вы возражаете против переименования столбцов во второй команде.

+0

Я думаю, что конструктор должен обслуживать инициализацию имен столбцов. Вы правы, если я делаю 'as.numeric' или' as.vector' Я храню имена столбцов, но затем теряю row.names, т. Е. Индекс. – Rhubarb

+0

@ Zhhubarb: Я не думаю, что авторы 'tseries' хотели, чтобы вы использовали 'data.frame'-методов на своих объектах данных. Внутренне ядро ​​'.Data' является R-матрицей. –