我目前正在处理一个非常大的数据集。我已经把一小部分代码拿出来了,它看起来像:
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亿次观察。我不熟悉如何处理像这么多观察这样的简单任务。有人会建议我如何优化?谢谢!
答案 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
})