2016-10-03 114 views
3

我有看起來像這樣sx16數據幀的數據幀:R:添加減去在每行中的單個列較短長度的柱,第一 - 第二,第二 - 第三

enter image description here

櫃面鏈接不工作:

數據幀被稱爲sx16

它的列名: 日期,開盤,高,低,結算

我要添加一個名爲up_period列打印1,如果低於計算值是正的和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)]) 

但是,這會產生以下錯誤:

Warning message: In sx16$Settle[1:nrow(sx16)] - sx16$Settle[2:nrow(sx16)] : longer object length is not a multiple of shorter object length

當然,這正是我想rbind.fill將解決。這裏是我卡住的地方。一旦我得到這個,我可以添加一個簡單的if-else來做1和0,但我不知道如何將這個較短的列添加到我的數據框中。

+1

歡迎來到SO。請閱讀[如何提出問題](http://stackoverflow.com/help/how-to-ask)和[如何製作可重現的示例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – Sotos

+0

使用樣本數據:iris $ Sepal.Length [1:(nrow(iris)-1)] - iris $ Sepal。長度[2:nrow(虹膜)]將處理除最後一個以外的所有值 –

+0

@OliPaul以及它們將如何將其綁定到數據框?它少了一排。所有的跡象都出來了(試試'iris $ Sepal.Length -c(NA,iris $ Sepal.Length [1:nrow(iris) - 1])) – Sotos

回答

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 

所以基本上,我再次添加您的專欄,翻譯下來一個位置,然後使用該虛擬列計算。

2

試一下這個(最後up_period沒有定義):

sx16$up_period <- sx16$Settle - c(sx16$Settle[-1],NA) 
+0

這工作完美。 「,NA」部分是我不明白的。非常感謝! – John

+0

最後一個元素不適用於滯後序列,NA需要保持序列長度相同。 –

1

您可以使用leaddplyr包:

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參數leadNA到在最後填入值以表明我們可以將其設置爲另一個值,例如,如果我們想要最後一個值。請注意,也不需要使用if-else,因爲我們可以使用as.numeric將布爾值轉換爲1,0

dput爲您的數據是:

sx16 <- structure(list(Date = structure(c(17074, 17073, 17072, 17071, 
17070, 17067), class = "Date"), Open = c(950, 947, 951.75, 946.75, 
951.5, 975), High = c(958.5, 957.25, 955.75, 953.5, 960.25, 976.25 
), Low = c(943, 946, 944.5, 934, 943.75, 952.5), Settle = c(954, 
950.25, 945.5, 952.5, 945.25, 955)), .Names = c("Date", "Open", 
"High", "Low", "Settle"), row.names = c(NA, -6L), class = "data.frame") 
+0

這是一個很好的解決方案。我認爲dplyr可能是我的解決方案,但我不太熟悉它。我將不得不補救。 as.numeric是if-else的優雅解決方案。謝謝。 – John

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) 
+0

我試圖使用差異,但我遇到了一些問題。主要的原因是計算變化的錯誤在於它顯示從第一行到第二行的變化是+7,而不是相反。儘管你的解決方案顯然完美無缺,但我不確定我做錯了什麼。我將不得不回去看看。謝謝。 – John

相關問題