Как заменить NA в средней и левой части каждой строки во фрейме данных значением? - PullRequest
1 голос
/ 21 апреля 2019

У меня есть фрейм данных, в котором есть NA в каждой строке. Некоторые слева, некоторые посередине, а некоторые справа. Примерно так:

a <- c(NA, NA, 1, NA)
b <- c(NA, 1,  1, NA)
c <- c(NA, NA, 1, 1)
d <- c(1, 1, NA, 1)
df <- data.frame(a, b, c, d)
df
# a  b  c  d
# NA NA NA 1
# NA 1  NA 1
# 1  1  1  NA
# NA NA 1  1

Я бы хотел заменить все NA, находящиеся посередине и справа, на 0, но оставить все NA, ведущие к 1 слева, как NA. Поэтому я хотел бы, чтобы эффективный способ (мой фрейм данных большой) имел этот фрейм данных:

# a  b  c  d
# NA NA NA 1
# NA 1  0  1
# 1  1  1  0
# NA NA 1  1

1 Ответ

1 голос
/ 21 апреля 2019

Мы можем использовать apply для циклического перемещения по строкам, найти индекс первого вхождения 1. Затем заменить NA от этого элемента до последнего на 0

df[] <- t(apply(df, 1, function(x) {
               i1 <- which(x == 1)[1]
               i2 <- i1:length(x)
               x[i2][is.na(x[i2])] <- 0
               x})) 

Или другой вариант

df[] <-  t(apply(df, 1, function(x) replace(x, 
                 cumsum(x ==1 & !is.na(x)) >= 1 & is.na(x), 0)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...