我有一个跨越三年的大型数据集(大约500,000行)。我想为第一次出现后重复45天的组条目名称添加一个唯一ID。在45天后,下一次出现条目名称时,它将被视为另一个组,并收到不同的ID。
举个例子:
df <- data.frame(
date=c("2013-5-6", "2013-10-5", "2014-1-1", "2014-4-4",
"2014-5-1", "2014-8-2", "2014-8-10"),
plane=c("a", "b", "c", "a", "a", "b", "c")
)
date plane
1 2013-5-6 a
2 2013-10-5 b
3 2014-1-1 c
4 2014-4-4 a
5 2014-5-1 a
6 2014-7-20 a
7 2014-8-2 b
8 2014-8-10 c我想要生成如下ID的代码:
date plane ID
1 2013-5-6 a 1
2 2013-10-5 b 2
3 2014-1-1 c 3
4 2014-4-4 a 4
5 2014-5-1 a 4
6 2014-7-20 a 5
7 2014-8-2 b 6
8 2014-8-10 c 7正如您所看到的,即使观察点5和6彼此相距不到45天,但它们具有不同的ID。这是因为观察点6距离观察点4(第二个平面A分组的开始)超过了45天。
发布于 2014-07-28 10:06:04
我不认为这正是您想要的,但这是获得滚动计数的一个不错的开始(在R中很难做到这一点)。我还没有看到很多用于按组滚动函数的解决方案,这些解决方案在使用较大的数据集时不会耗费很长时间或不会耗尽RAM。我认为你提供了一个更大的例子(包括输入和期望的输出),我将有更好的机会完全理解你的问题。
#Load libraries and download package
library("devtools")
install_github("boRingTrees","mgahan")
#Use the data.table package for speed
require(data.table)
require(boRingTrees)
setDT(df)
#Convert your date from character to date format
df[ , date := as.IDate(date)]
#Perform a rolling 45 count by plane adn then set the ID
df[ , roll.count45 := rollingByCalcs(df,bylist="plane", dates="date",lower=-45,upper=0)]
df[roll.count45 == 1 , ID := .I]
df[ , ID2 := ifelse(is.na(ID),ID[.I+1],ID[.I])]https://stackoverflow.com/questions/24986653
复制相似问题