Как заменить единичные вхождения на предыдущий статус - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть таблица данных, как показано ниже:

table=data.table(x=c(1:15),y=c(1,1,1,3,1,1,2,1,2,2,3,3,3,3,3),z=c(1:15)*3)

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

table=data.table(x=c(1:15),y=c(1,1,1,1,1,1,2,2,2,2,3,3,3,3,3),z=c(1:15)*3)

Это ожидаемая таблица данных.

Любая помощь приветствуется .

Ответы [ 2 ]

3 голосов
/ 15 апреля 2020

Вот один из способов:

library(data.table)
#Count number of rows for each group
table[, N := .N, rleid(y)]
#Change `y` value which have only one row
table[, y := replace(y, N ==1, NA)]
#Replace NA with last non-NA value
table[, y := zoo::na.locf(y)][, N := NULL]

table
#     x y  z
# 1:  1 1  3
# 2:  2 1  6
# 3:  3 1  9
# 4:  4 1 12
# 5:  5 1 15
# 6:  6 1 18
# 7:  7 2 21
# 8:  8 2 24
# 9:  9 2 27
#10: 10 2 30
#11: 11 3 33
#12: 12 3 36
#13: 13 3 39
#14: 14 3 42
#15: 15 3 45
0 голосов
/ 15 апреля 2020

Вот базовая опция R

inds <- which(diff(c(head(table$y,1),table$y))*diff(c(table$y,tail(table$y,1)))<0)
table$y <- replace(table$y,inds,table$y[inds-1])

такая, что

> table
     x y  z
 1:  1 1  3
 2:  2 1  6
 3:  3 1  9
 4:  4 1 12
 5:  5 1 15
 6:  6 1 18
 7:  7 2 21
 8:  8 2 24
 9:  9 2 27
10: 10 2 30
11: 11 3 33
12: 12 3 36
13: 13 3 39
14: 14 3 42
15: 15 3 45
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...