Цикл For плохо работает с оператором If: условие имеет длину> 1, и будет использоваться только первый элемент - PullRequest
0 голосов
/ 15 мая 2019

Я хотел бы проверить, существует ли (ExDate-n) в таблице дивидендов в столбце даты в таблице StockPrice, где n - инкрементная переменная. Если (ExDate-n) существует в таблице StockPrice, я назначу Exminus1 как ExDate-n Сначала он начинается с n = 1 (то есть вчера) и заканчивается, когда (ExDate-n) существует в таблице StockPrice. Поэтому я создал цикл for, но он не сработал.

Я пробовал цикл for с оператором if и оператором% in%, но он не работал.

Это оригинальные таблицы.

Таблица запасов:

Stock Table

Дивидендная таблица:

Dividend Table

Окончательный вывод:

Final output (Modified Dividend Table)

#Install necessary packages
install.packages('quantmod')
install.packages('plyr')
install.packages('dplyr')

library('quantmod')
library('plyr')
library('dplyr')

####################################   Input No.    ########################################
StockNo <- "6823.hk"
startDate <- "2001-01-01"
####################################   Input No.    ########################################

# Stock price Data
stockData <- new.env() #Make a new environment for quantmod to store data in
startDate = as.Date(StartDate) #Specify period of time we are interested in
endDate = Sys.Date()
tickers <- c(StockNo) #Define the tickers we are interested in
StockPrice <- getSymbols(tickers, env = stockData, src = "yahoo", from = startDate, to = endDate, auto.assign = FALSE)
StockPrice <- as.data.frame(StockPrice)
StockPrice <- cbind(Date=as.Date(rownames(StockPrice)),StockPrice)

#Dividend data
Dividend <- getDividends(tickers, env = stockData, src = "yahoo", from = startDate, to = endDate, auto.assign = FALSE)
Dividend <- as.data.frame(Dividend)
Dividend <- cbind(ExDate=as.Date(rownames(Dividend)),Dividend)

# Create Ex Date - 1
#!!!!!!!!!!!!!!!!!!!   Here is where I had issue with 

for (previous in (1:6))

{ 
  if ( (Dividend$ExDate - previous ) %in% StockPrice$Date) 

  { 
    Dividend$Exminus1 <- Dividend$ExDate-previous 
break;
    }
  previous <- previous+1

}

#New <- Dividend[,c(3,1,2)]

#Dividend

#Combine Stock Price & Dividend
CombineTable <- left_join (StockPrice, Dividend , by = c("Date"="Exminus1"))

#Calculate Yield
CombineTable$Yield <- CombineTable[,9]/CombineTable[,5]

#Preapre Month / Year for more segments
CombineTable$Month <- format(as.Date(CombineTable$ExDate, format="%d/%m/%Y"),"%m")
CombineTable$Year <- format(as.Date(CombineTable$ExDate, format="%d/%m/%Y"),"%Y")

tail(CombineTable)
## Get Data with Dividend Only
DivOnlyData <- CombineTable [ !is.na(CombineTable$ExDate) ,]
DivOnlyData

Я попробовал метод ifelse, но все равно не повезло. Новый столбец Dividend $ Exminus1 всегда возвращает Dividend $ ExDate - 5, даже если вложенный оператор ifelse верен, когда я его только запускаю.

ifelse ( (Dividend$ExDate - 1) %in% StockPrice$Date ,Dividend$Exminus1 <- Dividend$ExDate-1 , 
         ifelse ( (Dividend$ExDate - 2) %in% StockPrice$Date , Dividend$Exminus1 <- Dividend$ExDate-2, 
                  ifelse ( (Dividend$ExDate - 3) %in% StockPrice$Date , Dividend$Exminus1 <- Dividend$ExDate-3  ,
                           ifelse ( (Dividend$ExDate - 4) %in% StockPrice$Date , Dividend$Exminus1 <- Dividend$ExDate-4  ,
                                  ifelse ( (Dividend$ExDate - 5) %in% StockPrice$Date , Dividend$Exminus1 <- Dividend$ExDate-5 ,NA)))))  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...