вот, надеюсь, достаточное решение, вы можете добавить дату и выборку впоследствии:
A = matrix(c(rep(1,14),rep(0,6),rep(1,4),rep(0,12)),nrow=3,ncol=12,byrow=T)
A = data.frame(A)
colnames(A) = c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")
# Change the colnames to numerics( we can handle them much easier)
colnames(A) = c( 1:12)
A$Spawning_Period=rep(0,nrow(A))
#a loop is inefficient but shows you what actually happens here:
for(i in 1:nrow(A)){
Month.Vector=c()
#Shows a vector of months pre row, where species spawn
Month.Vector=colnames(A)[A[i,]==1]
Spawning.Period=c(1,diff(as.numeric(Month.Vector)))
#new Code to determine when there is no spawning period
if(length(Month.Vector)==0){
A[i,"Spawning_Period"]=NA } else{
#Determines the Break point
Break.Points=which(Spawning.Period!=1)
if(length(Break.Points)==0){
A[i,"Spawning_Period"]="1-12"}else{
Collect = list()
for(j in 1:length(Break.Points)){
if(j==1){
Collect [[1]] = paste(Month.Vector[1:(Break.Points[j]-1)][1],Month.Vector[1:(Break.Points[j]-1)][length(Month.Vector[1:(Break.Points[j]-1)])],sep="-")
Collect[[length(Break.Points)+1]] = paste(Month.Vector[(Break.Points[j]):length(Month.Vector)][1],Month.Vector[(Break.Points[j]):length(Month.Vector)][length(Month.Vector[(Break.Points[j]):length(Month.Vector)])],sep="-")
}
if(j!=1){
Collect[[j]] = paste(Month.Vector[(Break.Points[j-1]):(Break.Points[j]-1)][1],Month.Vector[(Break.Points[j-1]):(Break.Points[j]-1)][length(Month.Vector[(Break.Points[j-1]):(Break.Points[j]-1)])],sep="-")
}
}
A[i,"Spawning_Period"]= paste(unlist(Collect), collapse =", ")
}
}
}
У вас будут месяцы, обозначенные здесь как даты, но вы можете преобразовать их в соответствующие значения, если вы предпочитаете их таким образом. Надеюсь, это поможет.