为高维数据创建指标变量的最快方法(4亿行乘4列数据集)?

时间:2014-07-29 11:02:13

标签: r

我目前正在处理一个非常大的数据集。我已经把一小部分代码拿出来了,它看起来像:

mydata
A     B     Time 
11    22    2012-01-01
11    25    2012-01-01
11    25    2012-01-02
11    25    2012-01-03
11    25    2012-01-04
11    28    2012-01-01
11    28    2012-01-02
11    28    2012-01-03
11    28    2012-01-04
11    33    2012-01-01
11    33    2012-01-02
11    33    2012-01-03
11    33    2012-01-04
11    33    2012-01-05
11    33    2012-01-06
11    33    2012-01-07
11    37    2012-01-01
11    37    2012-01-02
       .....
11    37    2012-01-21
11    37    2012-01-22

我拥有的时间变量被识别为"日期"当我执行命令时:

class(Data$Time)
> "Date"

我的目标:

我想创建一个二元指示变量作为第四列,在以下时间显示" 1"

1)B下的条目是关于采用新值

2)当B中只有一个特定B值的值时,相当于说。 (例如,第一行的值为1)

" 0"

当B中的值是出现的B的最后一个值之前的任何值时,不包括只有一个唯一条目的情况(例如:对于B = 28,对应于时间&#34的行; 2012-01-01& #34;到" 2012-01-03"将获得值0,而" 2012-01-03"的值为" 1")。

基本上,简而言之,我正试图拥有一个" 1"对应于B中每个重复数字的最后一个元素," 0"'其他地方除了B下的数字只有一个值的情况,在这种情况下它有一个&#34 1#34 ;.

总而言之,我希望数据集看起来像:

mydata
A     B     Time        Indicator
11    22    2012-01-01  1
11    25    2012-01-01  0
11    25    2012-01-02  0
11    25    2012-01-03  0
11    25    2012-01-04  1
11    28    2012-01-01  0
11    28    2012-01-02  0
11    28    2012-01-03  0
11    28    2012-01-04  1
11    33    2012-01-01  0
11    33    2012-01-02  0
11    33    2012-01-03  0
11    33    2012-01-04  0
11    33    2012-01-05  0
11    33    2012-01-06  0
11    33    2012-01-07  1
11    37    2012-01-01  0
11    37    2012-01-02  0
       .....
11    37    2012-01-21  0
11    37    2012-01-22  1

对于合理的数据集,我的代码看起来像这样:

for(i in 1:nrow(mydata)){
if(mydata[i,2]==as.date("2012-01-01") & mydata[i+1,2]==as.date("2012-01-01")){
    mydata$indcator[i] == 1
}
if(mydata[i,2]<mydata[i+1,2]){
    mydata$indcator[i] == 0
}

}

但是,对于循环,这需要花费相当长的时间来查看大约4亿次观察。我不熟悉如何处理像这么多观察这样的简单任务。有人会建议我如何优化?谢谢!

2 个答案:

答案 0 :(得分:1)

另一个选择

my.data$Indicator <- with(my.data, c(as.numeric(diff(B) > 0), NA))

或使用dplyr

library(dplyr)

mutate(mydata, Indicator = as.integer(lead(B, 1) != B))

事实上,我会删除转换为整数/数字,因为这可能会加快这个过程。

答案 1 :(得分:0)

为了完整起见,我使用rle附加解决方案。

mydata <- data.frame(A = 11, B = rep(1:10000, sample(1:250, 10000, replace = TRUE)))

system.time({
  mydata$newindicator <- 0
  mydata[cumsum(rle(mydata$B)$lengths), "newindicator"] <- 1
})