我想返回字符串向量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的值。
我不知道为什么会这样。
答案 0 :(得分:3)
您收到的错误是说您的代码正在尝试评估缺少值(NA
),并希望找到一个数字。这可能有两个原因之一。
v
中有NA(我怀疑这不是实际问题)1:length(v)
,但是,在最后一次迭代中,这将尝试循环以尝试比较v[n+1] > v[n]
。没有v[n+1]
,因此这是一个缺失值并且您收到错误。 要删除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"
以下向量标记1
中v
的位置,其中条目的字符数多于上一个条目。
# 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