2015-11-24 76 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