2015-11-24 75 views
7

,直到價值,我想在data.table返回一個新列,顯示有多少行,直至達到比(的溫度)的電流值以下。[R data.table count行達到

library(data.table) 
set.seed(123) 
DT <- data.table(Temp = runif(10,0,20)) 

這是我想它看起來:

set.seed(123) 
DT <- data.table(
     Temp = runif(10,0,20), 
     Day_Below_Temp = c("5","1","3","2","1","NA","3","1","1","NA") 
) 

回答

2

這裏有一個dplyr方法:

library(dplyr) 
set.seed(123) 
dt <- data.frame(Temp = runif(10,0,20)) 
dt %>% mutate(Day_Below_Temp = 
       sapply(1:length(Temp), function(x) min(which(.$Temp[x:length(.$Temp)] < .$Temp[x]))-1)) 

     Temp Day_Below_Temp 
1 5.751550    5 
2 15.766103    1 
3 8.179538    3 
4 17.660348    2 
5 18.809346    1 
6 0.911130   Inf 
7 10.562110    3 
8 17.848381    1 
9 11.028700    1 
10 9.132295   Inf 
+0

確定這是偉大的@jeremycg,並確保我的理解是正確的,如果我想查什麼排的溫度值就比其它列下(附加列)值如何改變這種方法?謝謝 – user3740289

+0

沒問題。你可以把'。$ Temp [x:length(。$ Temp)]'改成'。$ additionalcolumn [x:length(。$ Temp)]''。 – jeremycg

+1

不幸的是,這個(和我自己刪除的答案)似乎和一個潮溼的一週一樣緩慢。即使在100K的情況下,這也要花上一分鐘的時間。我認爲必須通過一些聯接或棘手的方法來解決這個問題。阿倫,你在哪裏? – thelatemail

1

這做工作 - 不是非常快,雖然

DT[, rowN := .I] 

DT[, Day_Below_Temp := which(DT$Temp[rowN:nrow(DT)] < Temp)[1] - 1, 
    by = rowN 
    ][, rowN := NULL] 
4

使用新實現的n

require(data.table) # v1.9.7+ 
DT[, row := .I] # add row numbers 
DT[DT, x.row-i.row, on = .(row > row, Temp < Temp), mult="first"] 
# [1] 5 1 3 2 1 NA 3 1 1 NA 

行號是必要的,因爲我們需要找到指數比當前指數較低,因此需要是:上相等當前開發版本加入,這可以用簡單的方式完成如下條件在加入。我們執行在DT(內)一個自連接,即,對於每一行,基於提供給on參數條件下,我們發現在DT(外)第一匹配行索引。然後我們減去行索引以獲得當前行的位置。 x.row指外DTi.row到內DT索引。

要獲得devel的版本,請參閱安裝說明here


在1E5行:

set.seed(123) 
DT <- data.table(Temp = runif(1e5L, 0L, 20L)) 

DT[, row := .I] 
system.time({ 
    ans = DT[DT, x.row-i.row, on = .(row > row, Temp < Temp), mult="first", verbose=TRUE] 
}) 
# Non-equi join operators detected ... 
# forder took ... 0.001 secs 
# Generating non-equi group ids ... done in 0.452 secs 
# Recomputing forder with non-equi ids ... done in 0.001 secs 
# Found 623 non-equi group(s) ... 
# Starting bmerge ...done in 8.118 secs 
# Detected that j uses these columns: x.row,i.row 
# user system elapsed 
# 8.492 0.038 8.577 

head(ans) 
# [1] 5 1 3 2 1 12 
tail(ans) 
# [1] 2 1 1 2 1 NA