代码之家  ›  专栏  ›  技术社区  ›  dan

将浮点舍入到距离截断点内最接近的整数

  •  1
  • dan  · 技术社区  · 6 年前

    data.frame 其中一列指定id,另一些列具有数值。在这些数值列中,有一小部分整数和一小部分浮点数:

    set.seed(1)
    df <- data.frame(id = paste0("id_",sample(LETTERS,100,replace=T)),
                     var_1 = c(as.integer(runif(80,0,3)),runif(20,0,2))[permute::shuffle(100)],
                     var_2 = c(as.integer(runif(90,0,3)),runif(10,0,2))[permute::shuffle(100)],
                     var_3 = c(as.integer(runif(70,0,3)),runif(30,0,2))[permute::shuffle(100)])
    

    我在找一个 function NA .

    现在我有这个:

    df[,-1] <- do.call(cbind,lapply(colnames(df)[-1], function(i){
      dists <- ceiling(df[,i])-df[,i]
      idx <- which(dists > 0.5)
      if(length(idx) > 0) dists[idx] <- dists[idx]-1
      idx <- which(abs(dists) > 0.1)
      if(length(idx) > 0) dists[idx] <- NA
      return(df[,i]+dists)
    }))
    

    但是想知道有没有更快/更优雅的呢?

    1 回复  |  直到 6 年前
        1
  •  1
  •   akrun    6 年前

    也可以通过创建一个逻辑 matrix

    dists <- ceiling(df[-1]) - df[-1]
    i1 <- dists  > 0.5
    dists[i1] <- dists[i1] -1
    i2 <- abs(dists) > 0.1
    dists[i2] <- NA
    df[-1] <- df[-1] + dists
    
    推荐文章