【问题标题】:NA values in concatenated R vectors连接 R 向量中的 NA 值
【发布时间】:2012-08-11 17:57:44
【问题描述】:

考虑下面的代码

MyClass <- setRefClass("MyClass",

                          fields = list(body = "vector"),

                          methods = list(
                            initialize = function(length){
                              body <<- sample(-100:100, length) / 100
                            }
                          )
)

myFunction <- function(classA, classB){
    cut <- sample(1:length(classA$body), 1)
    new.bodyA <- c(classA$body[1:cut], classB$body[cut+1:length(classB$body)])
    new.bodyB <- c(classB$body[1:cut], classA$body[cut+1:length(classA$body)])
    classA$body <- new.bodyA
    classB$body <- new.bodyB
    return(list(classA, classB))
}

a <- MyClass$new(10)
b <- MyClass$new(10)

myFunction(a, b)

我想要实现的是两个新向量,它们根据随机元素索引组合两个给定向量的元素。

我不确定发生了什么,但是当我运行它时,新向量将包含 NA 值:

[[1]]
Reference class object of class "MyClass"
Field "body":
 [1]  0.50 -0.67  0.69 -0.43  0.12 -0.82  0.76  0.72 -0.02 -0.31    NA    NA    NA    NA    NA    NA    NA

[[2]]
Reference class object of class "MyClass"
Field "body":
 [1]  0.18  0.41  0.11  0.14  0.52 -0.67 -0.30 -0.85 -0.45  0.33    NA    NA    NA    NA    NA    NA    NA

我不确定为什么会发生这种情况 - 函数正常工作,但我不知道如何避免 NA 值。有人可以解释为什么会发生这种情况,并提出解决方法吗?

非常感谢

【问题讨论】:

    标签: r vector concatenation


    【解决方案1】:

    我很确定您代码中的问题在于您使用时

    cut+1:length(classB$body)
    

    当你应该使用时:

    (cut+1):length(classB$body)
    

    这些不是一回事,因为: 运算符的优先级高于二进制+(有关运算符优先级的详细信息,请参阅?Syntax)。自己看:

    2+1:6
    # [1] 3 4 5 6 7 8
    2+(1:6)
    # [1] 3 4 5 6 7 8
    (2+1):6
    # [1] 3 4 5 6
    

    【讨论】:

    • 谢谢弗洛德尔,这就是问题所在。我不确定您为什么会收到错误消息..?
    【解决方案2】:
     a = c(1,2,3,4,5)
     b = c(6,7,8,9,10)
    
     concat_a_wrong = c(a[1:3],b[3+1:length(b)])
     concat_a_correct  = c(a[1:3],b[(3+1):length(b)])
    
    
    
     >>concat_a_wrong 
     1  2  3  9 10 NA NA NA
     >>concat_a_correct  
     1  2  3  9 10
    

    在错误的情况下,您将剪切添加到范围 1:length 中的每个项目 所以实际上你在 b 数组中超出界限(NA)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-10
      • 1970-01-01
      • 2012-10-30
      • 2020-07-15
      • 1970-01-01
      • 2016-11-03
      • 1970-01-01
      • 2023-01-12
      相关资源
      最近更新 更多