如何有效地替换第一排';s NA与0按R分组

如何有效地替换第一排';s NA与0按R分组,r,R,是否有更好的方法按组将第一行的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[!du

是否有更好的方法按组将第一行的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)

x我们可以
为所有列替换每组第一行的
NA

使用
数据表
,可通过以下方式完成:

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))

另一个
数据。表
选项是:

x[name!=shift(name, fill=""), c("a","b","c") := {
    s <- copy(.SD) 
    s[is.na(.SD)] <- 0
    s
}, .SDcols=a:c]
x[name!=shift(name,fill=“”),c(“a”,“b”,“c”):={

s您可以存储
!重复的(x$name)
,无需
sapply
。按组将第一行的NA替换为0的基本解决方案:

i
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