Как эффективно заменить NA первого ряда на 0 группой на R - PullRequest
2 голосов
/ 10 марта 2020

есть ли лучший способ заменить NA первого ряда на 0 группой? Это пример. Спасибо.

x <- matrix(c(NA,NA,2,3,NA,4,NA,NA,6,NA,NA,7),nrow=4)
x <- as.data.table(x)
names(x) <- c("a","b","c")
name <- rep(c("P-1","P-2"),each=2)
x <- cbind(name,x)

x[!duplicated(x$name),] <- replace(x[!duplicated(x$name),],sapply(x[!duplicated(x$name),],is.na),0)

Ответы [ 3 ]

6 голосов
/ 10 марта 2020

Мы можем replace NA значений в первой строке в каждой группе для всех столбцов.

Используя data.table, это можно сделать как:

library(data.table)
x[, lapply(.SD, function(x) replace(x, seq_along(x) == 1 & is.na(x), 0)), name]

#   name  a  b  c
#1:  P-1  0  0  6
#2:  P-1 NA  4 NA
#3:  P-2  2  0  0
#4:  P-2  3 NA  7

Или с dplyr:

library(dplyr)

x %>%
  group_by(name) %>%
  mutate_at(vars(-group_cols()), ~replace(., row_number() == 1 & is.na(.), 0))
2 голосов
/ 10 марта 2020

Вы можете хранить !duplicated(x$name) и нет необходимости в sapply. base решение для заменить NA первого ряда на 0 группой :

i <- !duplicated(x$name)
x[i,] <- replace(x[i,], is.na(x[i,]), 0)
x
#  name  a  b  c
#1  P-1  0  0  6
#2  P-1 NA  4 NA
#3  P-2  2  0  0
#4  P-2  3 NA  7
1 голос
/ 10 марта 2020

Другой вариант data.table:

x[name!=shift(name, fill=""), c("a","b","c") := {
    s <- copy(.SD) 
    s[is.na(.SD)] <- 0
    s
}, .SDcols=a:c]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...