Условно меняем NA на нули - PullRequest
0 голосов
/ 05 марта 2019

У меня есть фрейм данных со структурой, подобной этой:

id x1 x2 x3 x4 x5 x6 x7  pos
1  1  2  1  5  NA NA NA  1
2  NA NA NA 4  2  2  3   3
3  NA NA 2  4  2  2  3   2
4  NA NA 7  4  2  2  3   2
5  NA NA NA 4  2  2  3   1

Я хочу изменить все NA на нули, но начиная с переменной pos, поэтому в результате df будет:

id x1 x2 x3 x4 x5 x6 x7  pos
1  1  2  1  5  NA NA NA  1
2  NA NA 0  4  2  2  3   3
3  NA 0  2  4  2  2  3   2
4  NA 0  7  4  2  2  3   2
5  0  0  0  4  2  2  3   1

Таким образом, позиция отмечает начальную позицию в списке переменных, для которых NA следует изменить на ноль.

Thx!

1 Ответ

0 голосов
/ 05 марта 2019

Вот базовая опция R с использованием mapply и replace

df[, -c(1, ncol(df))] <- t(mapply(
    function(x, y) replace(x, is.na(x) & seq_along(x) >= y, 0),
    as.data.frame(t(df[, -c(1, ncol(df))])), 
    unlist(df[ncol(df)])))
df
#  id x1 x2 x3 x4 x5 x6 x7 pos
#1  1  1  2  1  5  0  0  0   1
#2  2 NA NA  0  4  2  2  3   3
#3  3 NA  0  2  4  2  2  3   2
#4  4 NA  0  7  4  2  2  3   2
#5  5  0  0  0  4  2  2  3   1

Различные t() необходимы, потому что mapply применяет функцию по столбцу, и мы хотели бы обработать df по строкам.


Обновление

Вот более короткая и быстрая версия, позволяющая избежать вызова mapply и использовать прямое индексирование

# df2 is the x1...x7 block of df
df2 <- df[, -c(1, ncol(df))]
df2[is.na(df2) & t(apply(df2, 1, seq_along)) == df[, ncol(df)]] <- 0

df[, -c(1, ncol(df))] <- df2
df
#  id x1 x2 x3 x4 x5 x6 x7 pos
#1  1  1  2  1  5 NA NA NA   1
#2  2 NA NA  0  4  2  2  3   3
#3  3 NA  0  2  4  2  2  3   2
#4  4 NA  0  7  4  2  2  3   2
#5  5  0 NA NA  4  2  2  3   1

Примерданные

df <- read.table(text =
"id x1 x2 x3 x4 x5 x6 x7  pos
1  1  2  1  5  NA NA NA  1
2  NA NA NA 4  2  2  3   3
3  NA NA 2  4  2  2  3   2
4  NA NA 7  4  2  2  3   2
5  NA NA NA 4  2  2  3   1", header = T)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...