Как добавить последовательность для определенных значений в R - PullRequest
0 голосов
/ 11 мая 2018

У меня есть следующий фрейм данных в R

 a    b
 1    0
 2    0
 3    0
 4    1
 5    1
 6    1
 7    0
 8    0
 9    0
10    1
11    1

Желаемый кадр данных будет

 a    b     Flag
 1    0      1
 2    0      2
 3    0      3
 4    1      4
 5    1      4
 6    1      4
 7    0      5
 8    0      6
 9    0      7
10    1      8
11    1      8

Последовательность должна измениться на 0 и останется такой же для 1.

Я делаю это с помощью следующей команды

df$flag <- with(a, match(b, unique(b)))

Но, не дает мне желаемого результата.

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Следующее, кажется, делает то, что вы хотите.
Я нахожу это немного сложным, но это работает.

sp <- split(df, cumsum(c(0, abs(diff(df$b)))))
df2 <- lapply(sp, function(DF) {
    DF$Flag <- as.integer(DF$b != 1)
    if(DF$b[1] == 1) DF$Flag[1] <- 1 
    DF
})

rm(sp)    # clean up

df2 <- do.call(rbind, df2)
df2$Flag <- cumsum(df2$Flag)
row.names(df2) <- NULL
df2
#    a b Flag
#1   1 0    1
#2   2 0    2
#3   3 0    3
#4   4 1    4
#5   5 1    4
#6   6 1    4
#7   7 0    5
#8   8 0    6
#9   9 0    7
#10 10 1    8
#11 11 1    8
0 голосов
/ 11 мая 2018

Это было обновлено, чтобы учесть, что первый элемент b равен 1. Спасибо @ tk3 за то, что он указал на необходимость изменения.

Похоже, ваше правило - увеличивать флаг, если b равно нулю ИЛИ, если это первая 1 в последовательности.

Это даст ваш ответ.

cumsum(1 + c(df$b[1],diff(df$b)>0) - df$b)
[1] 1 2 3 4 4 4 5 6 7 8 8

Если вы просто хотите увеличить флаг, когда b равно нулю, вы можете использовать cumsum(1-df$b). За исключением того, что не поменял бы флаг для первого в серии. Поэтому я хотел сделать измененную версию b, которая установит b = 0 для всех первых. Вы можете использовать c(df$b[1], diff(df$b) >0), чтобы получить все места, которые b сменили с нуля на единицу - «первые». Сейчас

 df$b - c(df$b[1],diff(df$b)>0)
 0 0 0 0 1 1 0 0 0 0 1

заменяет все "первые" на нули , если не является первым элементом b. С этим измененным b мы можем использовать cumsum, как указано выше. Мы хотим взять сумму

1 - (df $ b - c (df $ b [1], diff (df $ b)> 0)) = 1 + c (df $ b [1], diff (df $ b)> 0) - df $ b

Какой был мой ответ

cumsum(1 + c(df$b[1],diff(df$b)>0) - df$b)
[1] 1 2 3 4 4 4 5 6 7 8 8

Оригинальная версия работала только для df $ b [1] = 0. Обновленная версия также должна работать для df $ b [1] = 1.

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