【问题标题】:R Replacing NAs with a unique random numerR用唯一的随机数替换NA
【发布时间】:2016-05-07 21:58:07
【问题描述】:

我在数据框中有一个看起来像这样的变量

x=c(1,2,4,6,7,NA,NA,5,NA,NA,9)

x 中的每个元素都是唯一编号,我想用唯一编号替换 NA。

我尝试过的是这样的,但想知道是否有更有效的方法来做到这一点。

x[is.na(x)]=sample(10:15,replace=F)
Warning message:
In x[is.na(x)] = sample(10:15, replace = F) :
  number of items to replace is not a multiple of replacement length

谢谢!

【问题讨论】:

  • 也许:x[is.na(x)] <- sample(seq(10, length = sum(is.na(x))), replace = FALSE)
  • 我有点喜欢x[is.na(x)] <- (1:length(x))[!(1:length(x) %in% x)],因为我可以确切地知道它在做什么。
  • 可以是 any 唯一编号吗?一定要随机生成吗?

标签: r replace unique


【解决方案1】:

如果您“计算”要从候选值集中采样的项目数(is.na 的总和似乎是一种很好的计数方法),那么您将不会收到错误:

x[is.na(x)] <- sample(10:15, size=sum(is.na(x)), replace=F)

> x
 [1]  1  2  4  6  7 12 14  5 11 13  9

【讨论】:

    【解决方案2】:

    您可以循环并创建一个缺失值索引的向量,然后将该向量传递给 replace(),其中嵌套了 random(),以生成用于替换缺失值的随机数。

    # data
    x=c(1,2,4,6,7,NA,NA,5,NA,NA,9)
    # vector of missing values
    v <- NULL
    # loop to find missing value indices
    for(i in 1:length(x)){
      if(is.na(x[i])==TRUE)
        v <- append(v, i)
    }
    # replace missing values with a random integer
    xnew <- replace(x, v, sample(10, length(v), replace = FALSE))
    
    
    
    x
    >> 1  2  4  6  7 NA NA  5 NA NA  9
    xnew
    >> 1  2  4  6  7  5 10  5  4  2  9
    

    【讨论】:

    • 一般来说,在 r 中应该避免使用 for 循环(除非它们不能这样做),因为它们的运行速度非常很慢。举个小例子,比如 OP,这并不算太糟糕,但对于较大的向量来说可能效率很低。
    猜你喜欢
    • 1970-01-01
    • 2021-03-11
    • 2021-01-10
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 2023-03-13
    相关资源
    最近更新 更多