Как я могу создать последовательность, которая также повторяет последнее значение, когда указанные записи присутствуют в другом векторе R? - PullRequest
1 голос
/ 05 марта 2020

Я хотел бы создать то, что отображается под x2.

Я хотел бы начать с одного и сделать так, чтобы значение в x2 увеличивалось на одно значение каждый раз. Когда ИСТИНА присутствует в x1, это значение должно увеличиваться один раз и оставаться прежним, если только три или более ИСТИНЫ не следуют, в этом случае оно должно увеличивать значение один во время каждой другой пары ИСТИНА.

ИСТИНА в x1 будет всегда следуйте по крайней мере еще на одной ИСТИНА в следующей строке.

Пример задачи и желаемых результатов:

x1<-c("FALSE", "FALSE", "TRUE", "TRUE", "FALSE", "TRUE", "TRUE", "FALSE", "TRUE", "TRUE", "TRUE", "TRUE", "FALSE", "TRUE", "TRUE", "FALSE")
x2<-c(1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 10, 10, 11)
data.frame(x1, x2)

      x1 x2
1  FALSE  1
2  FALSE  2
3   TRUE  3
4   TRUE  3
5  FALSE  4
6   TRUE  5
7   TRUE  5
8  FALSE  6
9   TRUE  7
10  TRUE  7
11  TRUE  8
12  TRUE  8
13 FALSE  9
14  TRUE 10
15  TRUE 10
16 FALSE 11

Ответы [ 2 ]

4 голосов
/ 05 марта 2020
cumsum(ave(as.logical(x1), x1, FUN = function(x){
    if(x[1] == TRUE) {
        rep(1:0, length.out = length(x))
    } else {
        rep(1, length(x))
    }
}))
#[1]  1  2  3  3  4  5  5  6  7  7  8  8  9 10 10 11
1 голос
/ 05 марта 2020

Может быть, я слишком усложнил это, но есть способ:

library(dplyr)

df %>%
  group_by(gr = data.table::rleid(x1)) %>%
  mutate(gr1 = !x1 |  (x1 & row_number() %% 2 == 1)) %>%
  ungroup() %>%
  mutate(out = cumsum(gr1)) %>%
  select(-gr, -gr1)


#    x1     x2   out
#   <lgl> <int> <int>
# 1 FALSE     1     1
# 2 FALSE     2     2
# 3 TRUE      3     3
# 4 TRUE      3     3
# 5 FALSE     4     4
# 6 TRUE      5     5
# 7 TRUE      5     5
# 8 FALSE     6     6
# 9 TRUE      7     7
#10 TRUE      7     7
#11 TRUE      8     8
#12 TRUE      8     8
#13 FALSE     9     9
#14 TRUE     10    10
#15 TRUE     10    10
#16 FALSE    11    11

data

df <- data.frame(x1, x2)
df <- type.convert(df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...