2016-08-15 51 views
5

我有一個關於在R 我有這樣如何引用多個先前的行中的R data.table

data <- data.table(a=c(1:7,12,32,13),b=c(1,5,6,7,8,3,2,5,1,4)) 

    a b 
1: 1 1 
2: 2 5 
3: 3 6 
4: 4 7 
5: 5 8 
6: 6 3 
7: 7 2 
8: 12 5 
9: 32 1 
10: 13 4 

數據集data.table問題現在我想產生第三列c,其將a的每一行的值與b的所有以前的值進行比較,並檢查b的任何值是否大於a。例如,在第5行,a = 5,b的先前值是1,5,6,7。因此圖6和7是大於5,因此的C值應爲1,否則這將是0。 結果應該是這樣的

 a b c 
1: 1 1 NA 
2: 2 5 0 
3: 3 6 1 
4: 4 7 1 
5: 5 8 1 
6: 6 3 1 
7: 7 2 1 
8: 12 5 0 
9: 32 1 0 
10: 13 4 0 

我與一個for循環嘗試,但它需要很長的時間。我也嘗試過換檔,但是我不能用換檔來引用多個先前的排。任何人有任何建議?

回答

5
library(data.table) 
data <- data.table(a=c(1:7,12,32,13),b=c(1,5,6,7,8,3,2,5,1,4)) 
data[,c:= a <= shift(cummax(b))] 
+2

這對於OP來說更像是一個點 - 你是否真的想要一些顯然是邏輯對象的東西來存儲爲一個整數?我理解想要整數的本能,但如果你問我,邏輯上的列應該被存儲爲「邏輯」 – MichaelChirico

2

這是一個基礎R溶液(見下面的dplyr溶液):

data$c = NA 
data$c[2:nrow(data)] <- sapply(2:nrow(data), function(x) { data$c[x] <- any(data$a[x] < data$b[1:(x-1)]) }) 

##  a b c 
## 1: 1 1 NA 
## 2: 2 5 0 
## 3: 3 6 1 
## 4: 4 7 1 
## 5: 5 8 1 
## 6: 6 3 1 
## 7: 7 2 1 
## 8: 12 5 0 
## 9: 32 1 0 
## 10: 13 4 0 

EDIT

這裏使用dplyr

library(dplyr) 
### Given the cumulative max and comparing to 'a', set see to 1/0. 
data %>% mutate(c = ifelse(a < lag(cummax(b)), 1, 0)) 

##  a b c 
## 1 1 1 NA 
## 2 2 5 0 
## 3 3 6 1 
## 4 4 7 1 
## 5 5 8 1 
## 6 6 3 1 
## 7 7 2 1 
## 8 12 5 0 
## 9 32 1 0 
## 10 13 4 0 

### Using 'shift' with dplyr 
data %>% mutate(c = ifelse(a <= shift(cummax(b)), 1, 0)) 
+0

也許你一個簡單的解決方案可以使用這個'data%>%mutate(c = as.integer(a Sumedh

+0

需要注意的一件事是,您的第一個解決方案是不利用data.table效率的基礎數據框解決方案。 –

+0

@DeanMacGregor感謝您的建議,我需要一段時間才能提出'data.table'解決方案,因爲我更熟悉'dplyr'。 – steveb

相關問題