質問
私が最後の行がこれであるTLTという名前のデータを持っていると仮定します:
TLT.Open TLT.Close
2010-12-14 92.4 92.14
そして、TLT.BARCOLORと呼ばれる追加のベクトルを追加したいので、次のようになります。
TLT.Open TLT.Close TLT.BarColor
2010-12-14 92.4 92.14 "Green"
これは、グリーンバーであろうと赤いバーの日であろうと「印刷」する関数です。
bar_color <- function(ticker) {
require("quantmod")
x <- getSymbols(ticker, auto.assign=FALSE)
open <- x[,1]
close <- x[,2]
last_open <- tail(open, n=1)
last_close <- tail(close, n=1)
if (last_open > last_close)
{print("Red Bar")}
else if (last_open < last_close)
{print("Green Bar")}
else {print("Doji Bar")}
print()r関数(プリントのみをコンソールにするだけ)を使用する代わりに、新しいベクトルを入力するために出力を送信するためにどのR関数を使用しますか?
super_dataframe <- cbind(TLT, apply(TLT, 1, valid_function))
このソリューションでは、サンプル関数は機能しません。しかし、関数が有効な場合、この方法で出力を添付することができます。
解決
ticker
データフレームになることはできませんが、キャラクターでなければなりません。そのため、Super Data Frameを作成するために使用するApplyを使用すると、問題が発生します。次の関数は、異なるティッカーのラベルを提供します。
bar_color <- function(ticker){
x <- getSymbols(ticker,auto.assign=FALSE)
n <- nrow(x)
switch(
sign(x[n,1]-x[n,4])+2,
"Green Bar",
"Doji Bar",
"Red Bar")
}
> TLT <- c("F","QQQQ")
> cbind(TLT,sapply(TLT,bar_color))
TLT
F "F" "Green Bar"
QQQQ "QQQQ" "Red Bar"
1人のティッカーのラベルが必要な場合は、さまざまな日付が必要な場合は、これが探しているものです。
bar_color <- function(ticker){
x <- as.data.frame(getSymbols(ticker,auto.assign=FALSE))
x$barcolor <- sapply(
as.numeric(sign(x[,1]-x[,4])+2),
function(j) switch(j,"Green Bar","Doji Bar","Red Bar")
)
return(x)
}
> head(bar_color("F"))
F.Open F.High F.Low F.Close F.Volume F.Adjusted barcolor
2007-01-03 7.56 7.67 7.44 7.51 78652200 7.51 Red Bar
2007-01-04 7.56 7.72 7.43 7.70 63454900 7.70 Green Bar
2007-01-05 7.72 7.75 7.57 7.62 40562100 7.62 Red Bar
2007-01-08 7.63 7.75 7.62 7.73 48938500 7.73 Green Bar
2007-01-09 7.75 7.86 7.73 7.79 56732200 7.79 Green Bar
2007-01-10 7.79 7.79 7.67 7.73 42397100 7.73 Red Bar
あなたの問題は、getSymbolsがデータフレームではなくXTSオブジェクトを返すという事実です。 XTSには、データにアクセスして追加する特定の方法があり、これがデータフレームのように動作することを期待してはなりません。
> X <- getSymbols("F",auto.assign=FALSE)
> class(X)
[1] "xts" "zoo"
他のヒント
印刷ステートメントを単に文字ベクトル自体(「レッドバー」などに変更した場合、それを最後の行などの既存のベクトルに追加できます。 print() 'sをreturn()に置き換えた場合、より明確なコードになる場合があります。唯一の問題は、ベクトルがすべて同じモードである必要があるため、文字ベクトルを受け入れるか、1行データを使用する必要があることです。
vec <- c(TLT[NROW(TLT), ] , bar.color( "TLT") ) # a character vector
onerowdf <- cbind( TLT[NROW(TLT), ], bar.color( "TLT")) )
# a data.frame (aka list)
所属していません StackOverflow