【问题标题】:Sort vector keeping NAs position in R排序向量保持 NA 在 R 中的位置
【发布时间】:2017-05-12 17:03:31
【问题描述】:

问题 1(已解决)

如何对矢量DoB:

进行排序
DoB <- c(NA, 9, NA, 2, 1, NA)

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

我想得到:

> 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

答案是

DoB[!is.na(DoB)]

感谢@BigDataScientist 和@akrun

现在,问题 2

说,我有一个向量id

id <- 1:6

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

> id
[1] 1 5 3 4 2 6

【问题讨论】:

  • 是/可以将idDoB 存储在一个共同的data.frame()matrix() 中吗?
  • 是的,他们可以

标签: r sorting na missing-data


【解决方案1】:

你可以这样做:

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

编辑:关于 cmets 中的后续问题:

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

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)

【讨论】:

  • 我可以扩展一下:如果我想按照相同的原则订购第二个向量 (id = 1:6) 怎么办(让id 为 1 5 3 4 2 6)?
  • 你的意思是:id[c(1,5,3,4,2,6)]? (但是,在后续 cmets 中,我们不应该与原始问题过于无关 :))
  • 我编辑了这个问题以使第二部分更清晰,我不认为精简套件值得打开第二个问题,但如果更合适的话,我也可以这样做。我的问题 2 基本上是,如何使用 order 返回有序索引的向量,同时将 NAs 固定在同一位置?
  • 你是对的,问题属于“在一起”,...希望编辑有所帮助!
  • 太棒了,你是:star:!
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-07
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多