Если значение before не равно 1, то следует заменить значение before вместо текущего значения, пока в R не будет найдено следующее не 1 значение - PullRequest
2 голосов
/ 11 марта 2020

Вектор ввода такой, как показано ниже, data=c(1,1,1,1,11,1,1,1,1,12,1,1,2,1,1,1)

Я хочу выводить как 1,1,1,1,11,11,11,11,11,12,12,12,2,2,2,2, где 1, идущие за ненулевыми значениями, должны быть вменены значением не 1 в R.

Я попробовал следующий код

data=c(1,1,1,1,11,1,1,1,1,12,1,1,2,1,1,1)
sapply(data, function(x) ifelse (lag(x)!=1,lag(x),x))

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

Ответы [ 4 ]

2 голосов
/ 11 марта 2020

Вы можете написать свою собственную функцию заполнения:

x <- c(1,1,1,1,11,1,1,1,1,12,1,1,2,1,1,1)

myfill <- function(x) {
  mem <- x[1]
  for (i in seq_along(x)) {
    if (x[i] == 1) {
      x[i] <- mem
    } else {
      mem <- x[i]
    }
  }
  x
}
myfill(x)
# 1  1  1  1 11 11 11 11 11 12 12 12  2  2  2  2
2 голосов
/ 11 марта 2020

Вы можете преобразовать каждое 1 после первого значения, отличного от 1, в NA, затем использовать zoo::na.locf():

library(zoo)

x <- c(1,1,1,1,11,1,1,1,1,12,1,1,2,1,1,1)

data[seq_along(x) > which.max(x!= 1) & x== 1] <- NA
na.locf(x)

[1]  1  1  1  1 11 11 11 11 11 12 12 12  2  2  2  2

Или использовать replace() для добавления значений NA:

na.locf(replace(x, seq_along(x) > which.max(x != 1) & x == 1, NA))

В ответ на ваш комментарий о применении его к группам вы можете использовать ave():

df <- data.frame(x = c(x, rev(x)), grp = rep(1:2, each = length(x)))

ave(df$x, df$grp, FUN = function(y)
    na.locf(replace(y, seq_along(y) > which.max(y != 1) & y == 1, NA))
)
1 голос
/ 11 марта 2020

Вы можете использовать rle из base , чтобы перезаписать 1 значением до.

x <- rle(data)
y <- c(FALSE, (x$values == 1)[-1])
x$values[y]  <- x$values[which(y)-1]
inverse.rle(x)
# [1]  1  1  1  1 11 11 11 11 11 12 12 12  2  2  2  2
1 голос
/ 11 марта 2020

Вы можете сопоставить уникальные 1 и не 1 значения с cumsum не- 1 значений.

(c(1, x[x != 1]))[match(cumsum(x != 1), 0:3)]
# [1]  1  1  1  1 11 11 11 11 11 12 12 12  2  2  2  2

Данные

x <- c(1, 1, 1, 1, 11, 1, 1, 1, 1, 12, 1, 1, 2, 1, 1, 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...