Pertanyaan Tugas R sederhana: membagi kolom tertentu dengan 1000 pada baris tertentu


Saya memiliki daftar harga saham OHLC yang ingin saya proses.

             Open      High      Low        Close         Volume
2003-01-05   6111.01   6145.00   6102.70    6145.00         956
2003-01-08   6145.00   6190.00   5960.00    6135.05        8771
2003-01-09   6120.01   6250.00   6120.00    6225.00       10579
2003-01-10   6240.00   6285.00   6225.10    6261.00        8882
2003-01-13   6231.00   6325.00   6231.00    6270.00        8015
2003-01-14   6279.00   6295.00   6180.01    6190.00        8461

Perusahaan membuat tanggal split @ diberikan, jadi saya harus membagi semua kolom terbuka, tinggi, rendah, dekat sebelum tanggal tersebut dengan 1000. Karena saya sedang mempelajari dasar-dasar R sekarang saya ingin mencari solusi R yang bagus untuk tugas ini. Bagian terbaik dari kode yang saya berhasil kode adalah (tidak bisa mencari tahu bagaimana menerapkan ke diberikan cols, stock $ Open tidak berfungsi):

apply(stock, 2, function(stock) stock/((index(stock)<"2007-07-20")*1000) )

Namun, hasilnya aneh, banyak diantaranya inf:

2006-10-26       Inf       Inf       Inf        Inf         Inf
2006-10-27       Inf       Inf       Inf        Inf         Inf
2006-10-30       Inf       Inf       Inf        Inf         Inf
2006-10-31       Inf       Inf       Inf        Inf         Inf
2006-11-01       Inf       Inf       Inf        Inf         Inf
2006-11-02       Inf       Inf       Inf        Inf         Inf
2006-11-03       Inf       Inf       Inf        Inf         Inf
2006-11-07       Inf       Inf       Inf        Inf         Inf

Banyak terima kasih sebelumnya!


4
2017-10-14 11:04


asal


Jawaban:


Saya tidak akrab dengan OHLC arrays, tetapi dengan asumsi bahwa metode indeks bekerja:

relevantRows<-index(stock) < "2007-07-20"

Setelah Anda memiliki vektor yang menahan semua baris yang relevan (sebenarnya sebuah vektor logis yang memegang TRUE untuk baris yang harus diubah), Anda mungkin dapat menggunakan ini seperti ini:

stock$Open[relevantRows]<-stock$Open[relevantRows]/1000

Itu mungkin (tergantung pada internal OHLC arrays), bahkan ini berfungsi:

stock[relevantRows, c("Open", "High", "Low", "Close")]<-stock[relevantRows, c("Open", "High", "Low", "Close")]/1000

2
2017-10-14 11:28



Jika tanggalnya tidak sebelum 20/7/2007, maka (index(stock)<"2007-07-20") aku s FALSE dan sebagainya (index(stock)<"2007-07-20")*1000 keluar sebagai nol. Anda Inf nilai adalah hasil dari pembagian dengan nol.

Anda dapat mencoba ini:

stock[index(stock) < "2007-07-20", -5] <- stock[index(stock) < "2007-07-20", -5] / 1000

2
2017-10-14 11:35



Anda dapat menggunakan adjRatios berfungsi dalam paket TTR untuk melakukan ini. Sepertinya Anda sudah memiliki objek xts, jadi itulah yang saya gunakan:

library(quantmod)
x <- structure(c(6111.01, 6145, 6120.01, 6240, 6231, 6279, 6145, 6190, 
6250, 6285, 6325, 6295, 6102.7, 5960, 6120, 6225.1, 6231, 6180.01, 
6145, 6135.05, 6225, 6261, 6270, 6190, 956, 8771, 10579, 8882, 
8015, 8461), .Dim = c(6L, 5L), .Dimnames = list(NULL, c("Open", 
"High", "Low", "Close", "Volume")), index = structure(c(1041746400, 
1042005600, 1042092000, 1042178400, 1042437600, 1042524000), tzone = "",
tclass = "Date"), class = c("xts", "zoo"), .indexCLASS = "Date", .indexTZ = "")
s <- xts(1/1000,as.Date("2003-01-10"))
r <- adjRatios(s,,Cl(x))
OHLC(x) * drop(r[,"Split"]) * drop(r[,"Div"])

Jika Anda menggunakan data dari Yahoo Finance, maka Anda dapat menggunakan adjustOHLC berfungsi di quantmod untuk secara otomatis menarik data split dan dividen dari Yahoo dan menyesuaikan seri. Lihat ?adjustOHLC untuk opsi lainnya.


1
2017-10-14 11:44