排序向量保持 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)
排序,但保持NA
s固定不变位置?:
> 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)
问题 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)
排序,但保持NA
s固定不变位置?:
> 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)