在数据框中使用迭代

时间:2017-07-25 23:13:26

标签: r dataframe iteration

我正在处理股票(何时买入/卖出以及持有多少股票)

我是一名尝试从Excel中的小样本移到R中更大的样本大小的初学者。

我将尝试用可重复的示例来解释我的问题。如果不可理解,请告诉我,我会尽力澄清。

我有两只股票:

AAPL.price <- c(140,145,150,148,152,156,153)
MSFT.price <- c(70,75,73,74,73,76,74)
price <- data.frame (AAPL.price,MSFT.price)

我还有一个数据框,告诉我何时购买以及何时出售给定的股票(1是买入,-1是卖出)

AAPL <- c(1,-1,0,1,0,0,-1)
MSFT <- c(0,0,1,0,-1,0,1)
decision <- data.frame (AAPL,MSFT)

此外,我还创建了一个公式,告诉我每个时间点我持有多少股票。但是,由于股票的数量取决于可用的现金,我已经创建了一个功能,总是告诉我,当我购买股票时,我总是100(只是为了简单,希望我以后可以改变它)。

功能是:

numberstocks <- function(x) {

newValue <- 0

for (i in 1:length(x)) {

    if (x[i] == -1) {
        newValue <- -100
    } else if (x[i] == 1) {
        newValue <- 100
    } else if (x[i] == 0 && newValue != 100) {
        newValue <- 0
    }
    x[i] <- newValue
}

return(x)

}

通过应用decision2 <- as.data.frame (lapply(decision,numberstocks)),当我持有股票时,我得到一个值为100的数据框,当我卖出它时,得到-100。

在此之后,我继续计算现金。为此,我在数据框中添加了两列:一列是我的现金流动(来自买卖),另一列来自我的实际现金价值。

positivevalues <- function (x)
sapply (seq_along(x),function (i) {
    if (x[i] < -0.5) {
        100
    }else{
        x[i]
    }
})

decision3 <- as.data.frame (lapply(decision2[,1:2], positivevalues))
decision2$cashmov <- with (decision2, c(rowSums(decision*price*decision3)))

decision2$cash <- with (decision2, c(1000000, matrix(0,6,1)))
decision2$cash <- 0
    for (i in 1) {
    decision2$cash [i] = 1000000
    }
    for (i in 2:7){
    decision2$cash [i] = decision2$cash[i-1]-decision2$cashmov[i]
}        

最后,我还创建了一个专栏,告诉我每个时期我购买的股票数量。

decision2$numberbuys <- with (decision2, c(rowSums(decision>0)))

我想要的是,对于每一点,当我购买股票时,而不是拥有&#34; 100&#34;,我想拥有

decision2$cash[i-1]/decision2$numberbuys[i]/price

哪会影响期间[i]的现金,从而影响[i + 1]等股票的数量。

有人可以帮我这个吗?

如果它太混乱我很抱歉,我尽量保持清醒。

提前谢谢

1 个答案:

答案 0 :(得分:0)

如果我找对你,那么下一个实现就会遇到问题:
decision2$cash[i-1]/decision2$numberbuys[i]/price

输入

con <- textConnection("AAPL MSFT    cash cashmov numberbuys
100    0 1000000   14000          1
-100    0 1014500  -14500          0
   0  100 1007200    7300          1
 100  100  992400   14800          1
 100 -100  999700   -7300          0
 100    0  999700       0          0
-100  100 1007600   -7900          1")

decision2 <- read.table(con, header = T)

df <- data.frame(cash = decision2$cash, numberbuys = decision2$numberbuys)

#cash.offset column is decision2$cash[i-1]
df$cash.offset <- c(NA, df$cash[1:nrow(df) - 1])
df$res <- df$cash.offset / df$numberbuys

df$AAPL <- df$res / decision2$AAPL
df$MSFT <- df$res / decision2$MSFT

df$AAPL[is.infinite(df$AAPL)] <- 0
df$MSFT[is.infinite(df$MSFT)] <- 0

print(df)

输出

     cash numberbuys cash.offset     res  AAPL  MSFT
1 1000000          1          NA      NA    NA    NA
2 1014500          0     1000000     Inf     0     0
3 1007200          1     1014500 1014500     0 10145
4  992400          1     1007200 1007200 10072 10072
5  999700          0      992400     Inf     0     0
6  999700          0      999700     Inf     0     0
7 1007600          1      999700  999700 -9997  9997