排序向量保持 NAs 在 R 中的位置

Sort vector keeping NAs position in R

问题 1(已解决)

如何对向量进行排序 DoB:

DoB <- c(NA, 9, NA, 2, 1, NA)

同时将 NA 保持在同一位置?

我想得到:

> DoB
[1] NA 1 NA 2 9 NA

我试过了(借用this answer

NAs_index <- which(is.na(DoB))
DoB <- sort(DoB, na.last = NA)
for(i in 0:(length(NAs_index)-1)) 
  DoB <- append(DoB, NA, after=(NAs_index[i+1]+i))

但是

> DoB
[1]  1 NA  2  9 NA NA

Answer is

DoB[!is.na(DoB)] <- sort(DoB)

Thanks to @BigDataScientist and @akrun

现在,问题 2

说,我有一个向量 id

id <- 1:6

那我也想按照同样的原则排序,让id的值按照order(DoB)排序,但保持NAs固定不变位置?:

> id
[1] 1 5 3 4 2 6

我们创建一个逻辑索引,然后执行 sort

i1 <- is.na(DoB)
DoB[!i1] <- sort(DoB[!i1])
DoB
#[1] NA  1 NA  2  9 NA

你可以这样做:

DoB[!is.na(DoB)] <- sort(DoB)

编辑:关于评论中的后续问题:

您可以为此使用 order(),并使用 na.last 参数处理 NA,..

data <- data.frame(DoB = c(NA, 9, NA, 2, 1, NA), id = 1:6)
data$id[!is.na(data$DoB)] <- order(data$DoB, na.last = NA)
data$DoB[!is.na(data$DoB)] <- sort(data$DoB)