Есть ли способ получить диапазон значений месяца в отдельном столбце на основе нескольких столбцов? - PullRequest
0 голосов
/ 10 июля 2019

У меня есть 12 столбцов, которые включают данные о нересте для видов.В каждом столбце 1 указывает, что вид нерестится в течение этого месяца, а 0 указывает, что это не так.Я хочу создать еще один столбец под названием период нереста, который дает диапазон месяцев.У меня есть другой столбец, который включает даты опроса, и я хочу другой столбец, который просматривает столбец периода нереста и даты опроса и определяет, проводился ли опрос в течение периода нереста.

Ожидаемые результаты:

Jan   Feb   Mar   Apr   May   Jun   Jul   Aug   Sep   Oct  Nov  Dec   Spawning_Period      Survey_Date   Survey_Sampling
1     1     1     1     1     1     1     1     1     1     1     1     Jan-Dec            17/01/2019        1
1     1     0     0     0     0     0     0     1     1     1     1     Jan-Feb, Sep-Dec   13/06/2019        0

Я думал, что цикл for может быть ответом, поскольку существует 500 наблюдений.Я смотрел на похожие вопросы и не мог найти то, что искал.

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Это полное решение с использованием @RBeginner на тот случай, если кто-то захочет его увидеть.Я заметил, что когда перерывов не было, он по-прежнему публиковал 1-12, когда должно быть 4,5, поэтому я добавил это, а для 0 через 1-12 я добавил NA.

spawning_period_ind <- spawning_period[,c(1:12)]
colnames(spawning_period_ind) = c( 1:12)
spawning_period_ind$Spawning_Period=c(0,0)

for(i in 1:nrow(spawning_period_ind)){

  Month.Vector=c()

  #Shows a vector of months pre row, where species spawn
  Month.Vector=colnames(spawning_period_ind)[spawning_period_ind[i,]==1]

  Spawning.Period=c(1,diff(as.numeric(Month.Vector)))

  #new Code to determine when there is no spawning period
  if(all(is.na(Month.Vector)==TRUE)){
    spawning_period_ind[i,"Spawning_Period"]=NA } 
  else if(all(is.na(Month.Vector)==FALSE & length(Spawning.Period)==12)) {
    spawning_period_ind[i,"Spawning_Period"]="1-12"
  }
  else
    {
      #Determines the Break point
      Break.Points=which(Spawning.Period!=1)
      if(length(Break.Points)==0 & length(Spawning.Period)!=12)
        {
        spawning_period_ind[i,"Spawning_Period"]= paste(Month.Vector, collapse = ",", sep = "")
        }
      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="-")

            }


          }

          spawning_period_ind[i,"Spawning_Period"]= paste(unlist(Collect), collapse =", ")
        }
    }
}
0 голосов
/ 10 июля 2019

вот, надеюсь, достаточное решение, вы можете добавить дату и выборку впоследствии:

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 =", ")
}
}
}

У вас будут месяцы, обозначенные здесь как даты, но вы можете преобразовать их в соответствующие значения, если вы предпочитаете их таким образом. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...