Я пытаюсь перенести значение из предыдущей группы в следующую группу. Я пытался решить ее, используя rleid, но не смог получить желаемый результат.

df <- data.frame(signal = c(1,1,5,5,5,2,3,3,3,4,4,5,5,5,5,6,7,7,8,9,9,9,10), 
                 desired_outcome = c(NA, NA, 1, 1, 1, 5, 2, 2, 2, 3, 3, 4, 4,4,4,5,6,6,7,8,8,8,9))

# outcome column has the expected result -
   signal desired_outcome
1       1              NA
2       1              NA
3       5               1
4       5               1
5       5               1
6       2               5
7       3               2
8       3               2
9       3               2
10      4               3
11      4               3
12      5               4
13      5               4
14      5               4
15      5               4
16      6               5
17      7               6
18      7               6
19      8               7
20      9               8
21      9               8
22      9               8
23     10               9
4
Saurabh 19 Авг 2019 в 02:47

2 ответа

Лучший ответ

rle даст lengths и values последовательностей, в которых встречается одно и то же значение. Затем: удалите последнее значение, сдвиньте оставшийся values на один, добавьте NA в начало значения, чтобы учесть удаление последнего значения, и повторите каждое значение, как указано lengths (т.е. lengths последовательностей того же значения в исходном векторе).

with(rle(df$signal), rep(c(NA, head(values, -1)), lengths))
# [1] NA NA  1  1  1  5  2  2  2  3  3  4  4  4  4  5  6  6  7  8  8  8  9
3
d.b 19 Авг 2019 в 02:06

Другой способ может заключаться в том, чтобы сначала lag signal затем использовать rleid для создания групп и использовать mutate для трансляции первого значения каждой группы всем значениям.

library(dplyr)

df %>%
   mutate(out = lag(signal)) %>%
   group_by(group = data.table::rleid(signal)) %>%
   mutate(out = first(out)) %>%
   ungroup() %>%
   select(-group)


# A tibble: 23 x 2
#   signal   out
#    <dbl> <dbl>
# 1      1    NA
# 2      1    NA
# 3      5     1
# 4      5     1
# 5      5     1
# 6      2     5
# 7      3     2
# 8      3     2
# 9      3     2
#10      4     3
# … with 13 more rows
1
Ronak Shah 19 Авг 2019 в 00:37