R - Создание столбца идентификаторов на основе каждого случая, когда условие в другом столбце сбрасывается до 1 - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть данные, содержащие популяции видов и их численность в каждой популяции. Я хотел бы добавить еще один столбец, который содержит идентификатор для каждого вида. Столбик популяции увеличивается вверх от 1 и сбрасывается каждый раз, когда появляется новый вид. Поэтому столбец идентификаторов видов будет учитываться вдоль столбца популяций видов и увеличиваться в значении на +1 каждый раз, когда столбец популяций сбрасывается до «1».

Я понимаю принцип того, чего хочу достичь, но до сих пор не смог получить правильный результат. Ниже я включил фиктивный пример, содержащий популяции и подсчет для 2 видов:

df <- data.frame(Count=c(10, 5, 4, 10, 6),
                 Population=c(1, 2, 3, 1, 2))

Count Population
    10          1
     5          2
     4          3
    10          1
     6          2

Желаемый результат будет:

Count Population species
  10          1       1
   5          2       1
   4          3       1
  10          1       2
   6          2       2 

Где был создан новый столбец идентификаторов видов на основе каждый раз значение в df $ Population сбрасывается до 1. В действительности набор данных содержит много сотен видов, каждый из которых имеет разное количество популяций.

Заранее спасибо за любые предложения. Заранее извиняюсь, если вопрос или пример не ясны.

Майк

1 Ответ

0 голосов
/ 24 февраля 2020

Почти наверняка есть более элегантный способ сделать это, но мне подходит следующее:

df <- data.frame(Count=c(10, 5, 4, 10, 6),
             Population=c(1, 2, 3, 1, 2))
df$species <- ifelse(df$Population==1,1,0)

counter1 <- 0
counter2 <- 1
for(i in 1:nrow(df)){
            if(df$species[i]==counter2){
                            df$species[i] <- df$species[i] + counter1
                            counter1 <- counter1 + 1}
            else (next) }
df

for(i in 2:nrow(df)){
            if(df$species[i]==0){
            df$species[i] <- df$species[i-1]
            } else (next)
}
df
...