我的数据框看起来像这个sx16数据框:
包含链接不起作用:
数据框称为sx16
它有列名: 日期,开放,高,低,结算
我想添加一个名为up_period的列,如果下面的calc为正,则打印1;如果下面的calc为负,则打印0:
sx16$Settle[ 1: nrow(sx16)] - sx16$Settle[ 2: nrow(sx16)]
当然,这会产生错误,因为新列表比原始sx16短。
我试图像这样包装rbind.fill:
sx16$up_period <- rbind.fill(sx16$Settle[ 1: nrow(sx16)] - sx16$Settle[ 2: nrow(sx16)])
但这会产生以下错误:
警告讯息: 在sx16 $ Settle [1:nrow(sx16)] - sx16 $ Settle [2:nrow(sx16)]: 较长的物体长度不是较短物体长度的倍数
当然,这正是我认为rbind.fill会解决的问题。这是我被困的地方。一旦我得到这个,我可以添加一个简单的if-else来做1和0,但我无法弄清楚如何将这个较短的列添加到我的数据框。
答案 0 :(得分:2)
试试这个(最后的up_period没有定义):
sx16$up_period <- sx16$Settle - c(sx16$Settle[-1],NA)
答案 1 :(得分:1)
您可以使用lead
包中的dplyr
:
library(dplyr)
result <- sx16 %>% mutate(up_period=as.numeric((Settle-lead(Settle,default=NA)) > 0))
## Date Open High Low Settle up_period
##1 2016-09-30 950.00 958.50 943.00 954.00 1
##2 2016-09-29 947.00 957.25 946.00 950.25 1
##3 2016-09-28 951.75 955.75 944.50 945.50 0
##4 2016-09-27 946.75 953.50 934.00 952.50 1
##5 2016-09-26 951.50 960.25 943.75 945.25 0
##6 2016-09-23 975.00 976.25 952.50 955.00 NA
在这里,我们明确地将default
的{{1}}参数设置为lead
以填写末尾的值,以表明我们可以将此值设置为其他值,例如最后一个值如果我们想要。请注意,也无需使用NA
,因为我们可以使用if-else
将布尔值转换为1,0
。
您的数据的as.numeric
为:
dput
答案 2 :(得分:1)
我很惊讶没人提到diff
。 diff(sx16$Settle)
相当于sx16$Settle[2:nrow(sx16)] - sx16$Settle[1:(nrow(sx16)-1)]
。所以以下内容适合您:
sx16$up_period <- c(ifelse(diff(sx16$Settle)<0, 1, 0), NA)
答案 3 :(得分:0)
我将使用虹膜数据集:
x <- iris
dummy <- x$Sepal.Length #repeat column again but rename dummy
dummy[length(dummy)+1]=0 #add a value of 0 to the end for the day thats not happened yet
dummy <- dummy[2:length(dummy)] #translate the column to match the original for calculation
x <- cbind(x,dummy) #add the column to the data
x$up <- x$Sepal.Length-x$dummy #new calculated column
x$dummy <- NULL #remove dummy
基本上,我再次添加了您的列,将其翻译为一个位置,然后使用该虚拟列进行计算。