【问题标题】:NAs are not allowed in subscripted assignments下标作业中不允许使用 NA
【发布时间】:2014-11-12 17:34:46
【问题描述】:

我有一个简单的问题,但我无法掌握克服它的逻辑。

我有带有 NA 的数值向量,并希望对它们应用条件相关操作。

一个与我的问题类似的简单例子是:

x <- c(1,3,5,7,NA,2,4,6)
x[x>=5] <- c(1:8)[x>=5]
x[x<5] <- (c(1:8)*10)[x<5]

它返回错误“NAs are not allowed in subscripted assignments”,所以我想知道什么是明智的解决方案,因为单独运行每个属性都可以按预期工作。

我希望得到以下结果:

[1]  10  20  3  4 NA  60  70  8

最好不必创建一个 for 循环,因为此操作已经在一个用于空建模的函数中,并且需要很长时间的大量迭代。

提前谢谢你, 莱昂纳多

注意。 NAs 表示不可用的值

【问题讨论】:

  • 这很有趣。似乎您不能将整数与NA 结合起来,而仅当您在 RHS 上有多个值时才进行子集和分配......即x[c(NA, 1)] &lt;- 100x[NA] &lt;- 100 都可以工作,而 x[c(NA, 1)] &lt;- 100:101x[NA] &lt;- 100:101 不会
  • 这是一个有价值的问题,因为它会收到该错误消息。但重要的是要注意,即使您的代码在没有 NA 导致的错误的情况下运行,也不会产生预期的结果。代码的第 2 行将覆盖用于预测上述 3 和 4 的结果的 5 和 7 的原始值(而不是 30 和 40),并且在调用第 3 行时它们将是 3 和 4,导致他们变成 30 和 40。试试:x[x&gt;=5 &amp; !is.na(x)] &lt;- c(1:8)[x&gt;=5 &amp; !is.na(x)] ; x[x&lt;5 &amp; !is.na(x)] &lt;- (c(1:8)*10)[x&lt;5 &amp; !is.na(x)]

标签: r


【解决方案1】:

您的逻辑还需要在子集中排除 NA。请参阅以下示例。请注意,在修改 x 之前,子集向量已被存储。

x <- c(1,3,5,7,NA,2,4,6)
subset1 <- x>=5 & !is.na(x)
subset2 <-  x<5 & !is.na(x)

x[subset1] <- which(subset1)
x[subset2] <- 10*which(subset2)

【讨论】:

    【解决方案2】:

    我认为您正在混合分配和下标。我相信你所追求的更接近于这个:

    x <- c(1,3,5,7,NA,2,4,6)
    x.greater <- c(1:8)[x>=5]
    x.less <- (c(1:8)*10)[x<5]
    
    x.greater
    # 3  4 NA  8
    x.less
    # 10 20 NA 60 70
    
    result <- c(x.greater, x.less)
    result
    # 3  4 NA  8 10 20 NA 60 70
    

    【讨论】:

      【解决方案3】:
      x <- c(1,3,5,7,NA,2,4,6)
      
      x.greater <- c(1:8)*(x>=5)
      # 0  0  3  4 NA  0  0  8
      
      x.less <- c(1:8)*10*(x<5)
      # 10 20  0  0 NA 60 70  0
      
      result <- x.greater + x.less
      # 10 20  3  4 NA 60 70  8
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多