Другое изменение:
Учитывая ваши ответы на другие решения, вы можете получить то, что вы хотите в одной строке:
Data$extra <- ave(as.integer(Data$myf),Data$id,FUN=function(x) sum(diff(x)!=0))
В этом случае объединение не требуется.
«За заданный промежуток времени» означает, что вы можете выбрать промежуток времени и затем применить функцию.Joshuas ответ самый быстрый способ.Есть более общая функция, которая дает вам больше информации о длинах и значениях прогона, rle
.Обязательно проверьте это.
На основе ответа Джошуаса этот пример показывает, как вы можете легко работать с датами для выбора заданного промежутка времени.
Редактировать: я обновил ответ напокажет вам, как легко конвертировать ваши столбцы год и месяц в дату.Вам также следует использовать as.numeric
при применении всего этого к фактору, подобному вашему.
#Testdata
set.seed(21)
Data <- data.frame(id=rep(letters[1:3],each=24),
year= rep(rep(c(2005,2006),each=12),6),
month=rep(1:12,6),
myf=sample(c("A","B"),24*3,TRUE))
#transformation
Data$dates <- as.Date(paste(Data$year,Data$month,"1",sep="-"))
#function
cond.count <- function(from,to,data){
x <- data[data$dates>from & data$dates<to,]
tapply(as.numeric(x$myf),x$id,function(y)sum(diff(y)!=0))
}
#example
from <- as.Date("2005-01-01")
to <- as.Date("2006-04-15")
cond.count(from,to,Data)