【问题标题】:R - select column depending on available valuesR - 根据可用值选择列
【发布时间】:2014-03-27 13:08:55
【问题描述】:

我有 x:

x = structure(c(12, 24, NA, 25), .Dim = c(2L, 2L))

> x
     [,1] [,2]
[1,]   12   NA
[2,]   24   25

并且想要返回y,其中y 等于x 的第二列中的值,如果该值可用,则等于第一列中的值。

所以:

> y
[1] 12 25

我想将解决方案用于大型数组,因此我正在寻找一个矢量化解决方案,如果这有意义的话。

【问题讨论】:

    标签: r vectorization logical-operators idioms


    【解决方案1】:

    ifelse 完全符合您的要求:

    > ifelse(is.na(x[,2]), x[,1], x[,2])
    [1] 12 25
    

    如果速度是最重要的(并且您不想与 C 混淆),您可以尝试:

    y <- x[,2]
    y[is.na(y)] <- x[is.na(y), 1]
    

    这有效地缩短了ifelse 的一些开销。考虑:

    set.seed(1)
    x <- cbind(sample(1:1e5), sample(c(1:95000, rep(NA, 5000))))
    library(microbenchmark)
    microbenchmark(
      z <- ifelse(is.na(x[,2]), x[,1], x[,2]),
      {y <- x[,2]; y[is.na(y)] <- x[is.na(y), 1]},
      times=10
    )
    # Unit: milliseconds
    #                                       expr        min  median
    # z <- ifelse(is.na(x[, 2]), x[, 1], x[, 2])      30.46   33.06
    # y <- x[, 2]; y[is.na(y)] <- x[is.na(y), 1]       5.48    5.77 
    identical(y, z)    
    # [1] TRUE
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-21
      • 2016-02-23
      • 1970-01-01
      • 2018-01-20
      • 1970-01-01
      相关资源
      最近更新 更多