R:添加一个较短长度的列,减去单个列中的每一行,第1列 - 第2行,第2行 - 第3行

时间:2016-10-03 09:50:38

标签: r

我的数据框看起来像这个sx16数据框:

enter image description here

包含链接不起作用:

数据框称为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,但我无法弄清楚如何将这个较短的列添加到我的数据框。

4 个答案:

答案 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)

我很惊讶没人提到diffdiff(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

基本上,我再次添加了您的列,将其翻译为一个位置,然后使用该虚拟列进行计算。