关于R中需要TRUE / FALSE的缺失值

时间:2018-02-02 01:56:09

标签: r

我想返回字符串向量v中的次数,即下一个连续索引处的元素比当前索引具有更多字符。 这是我的代码

BiggerPairs <- function (v) {
numberOfTimes <- 0
for (i in 1:length(v)) {
if((nchar(v[i+1])) > (nchar(v[i]))) {
numberOfTimes <- numberOfTimes + 1
}
}
return(numberOfTimes)
}
}

缺少需要TRUE / FALSE的值。

我不知道为什么会这样。

2 个答案:

答案 0 :(得分:3)

您收到的错误是说您的代码正在尝试评估缺少值(NA),并希望找到一个数字。这可能有两个原因之一。

  1. 您的向量v中有NA(我怀疑这不是实际问题)
  2. 您写的循环来自1:length(v),但是,在最后一次迭代中,这将尝试循环以尝试比较v[n+1] > v[n]。没有v[n+1],因此这是一个缺失值并且您收到错误。
  3. 要删除NA,请尝试以下代码:

    v <- na.omit(v)
    

    要改善循环,请尝试以下代码:

    for(i in 1:(length(v) -1)) {
        if(nchar(v[i + 1]) > nchar(v[i])) {
            numberOfTimes <- numberOfTimes + 1
        }
    }
    

    这是一些示例虚拟代码。

    # create random 15 numbers
    set.seed(1)
    v <- rnorm(15)
    
    # accessing the 16th element produces an NA
    v[16]
    #[1] NA
    
    # if we add an NA and try to do a comparison, we get an error
    v[10] <- NA
    v[10] > v[9]
    #[1] NA
    
    # if we remove NAs and limit our loop to N-1, we should get a fair comparison
    v <- na.omit(v)
    numberOfTimes <- 0
    
    for(i in 1:(length(v) -1)) {
        if(nchar(v[i + 1]) > nchar(v[i])) {
            numberOfTimes <- numberOfTimes + 1
        }
    }
    
    numberOfTimes
    #[1] 5
    

答案 1 :(得分:1)

这就是你要追求的吗?我认为不需要for循环。

我正在生成一些示例数据,因为您没有提供任何数据。

# Generate some sample data
set.seed(2017);
v <- sapply(sample(30, 10), function(x)
    paste(sample(letters, x, replace = T), collapse = ""))
v;
#[1] "raalmkksyvqjytfxqibgwaifxqdc" "enopfcznbrutnwjq"
#[3] "thfzoxgjptsmec"               "qrzrdwzj"
#[5] "knkydwnxgfdejcwqnovdv"        "fxexzbfpampbadbyeypk"
#[7] "c"                            "jiukokceniv"
#[9] "qpfifsftlflxwgfhfbzzszl"      "foltth"

以下向量标记1v的位置,其中条目的字符数多于上一个条目。

# The following vector has the same length as v and
# returns 1 at the index position i where 
# nchar(v[i]) > nchar(v[i-1])
idx <- c(0, diff(nchar(v)) > 0);
idx;
# [1] 0 0 0 0 1 0 0 1 1 0

如果您只想知道任何条目是否包含比前一条目更多的字符,您可以这样做:

# If you just want to test if there is any position where
# nchar(v[i+1]) > nchar(v[i]) you can do
any(idx == 1);
#[1] TRUE

或计算出现次数:

sum(idx);
#[1] 3