如果for循环中的语句不符合R中的限定向量

时间:2014-06-18 07:29:13

标签: r loops for-loop

我在R中编写了一个函数来附加零,使得1到100之间的任何数字都显示为001(1),010(10)和100(100),但我无法弄清楚为什么if声明不符合我的要求。

id <- 1:11
Attach_zero <- function(id){

    i<-1
    for(i in id){
        if(id[i] < 10){
            id[i] <- paste("00",id[i], sep = "")
        }

        if((id[i] < 100)&&(id[i]>=10)){
            id[i] <- paste("0",id[i], sep = "")
        } 
        print(id[i])
    }
}

输出为&#34; 001&#34;,&#34; 2&#34;,&#34; 3&#34;,...&#34; 010&#34;,&#34; 11& #34;

我不知道为什么for循环跳过中间整数。

3 个答案:

答案 0 :(得分:1)

这里的问题是您要将字符串(例如&#34; 001&#34;)分配给数字向量。执行此操作时,整个id向量将转换为character(向量的元素必须为一种类型)。

因此,在将110进行比较并将"001"分配给id[1]之后,id的下一个元素是"2"(即字符2)。当不等式包括字符元素(例如"2" < 10)时,数字部分被强制转换为字符,并且应用字母排序规则。这些规则意味着"100""10"都位于"2"之前,因此您的if条件都不会满足。对于除10之外的所有数字都是如此,根据字母排序小于100,因此满足您的第二个if条件。当你到达11时,两个条件都不会再次遇到,因为&#34;字&#34; "11"位于"100"之后。

虽然有几种方法可以修复您的功能,但R中存在此功能(如评论中所述),包括sprintfformatC

sprintf('%03d', 1:11)
formatC(1:11, flag=0, width=3)
# [1] "001" "002" "003" "004" "005" "006" "007" "008" "009" "010" "011"

对于另一种矢量化方法,您可以使用嵌套的ifelse语句:

ifelse(id < 10, paste0('00', id), ifelse(id < 100, paste0('0', id), id))

答案 1 :(得分:1)

试试这个:

id <- 1:11
Attach_zero <- function(id){
  id1 <- id
  i <- 1
  for (i in seq_along(id)) {
    if(id[i] < 10){
      id1[i] <- paste("00", id[i], sep = "")
    }
    if(id[i] < 100 & id[i] >= 10){
      id1[i] <- paste("0", id[i], sep = "")
    } 
  }
  print(id1)
}

答案 2 :(得分:1)

如果您使用id = c(1:3, 6:11)尝试使用您的功能:

Attach_zero(id)
##[1] "001"
##[1] "2"
##[1] "3"
##[1] "8"
##[1] "9"
##[1] "010"
##[1] "11"
##Error in if (id[i] < 10) { : missing value where TRUE/FALSE needed

这里发生的是省略了缺失值,因为您的i值表示如此。 i<-1在用for (i in id)编写之后不执行任何操作,而i依次为id ith 值提供id <- c(1:3, 6:11)一个索引。因此,如果您的ID为Attach_zero <- function(id){ for(i in 1:length(id)){ if(id[i] < 10){ id[i] <- paste("00",id[i], sep = "") } if((id[i] < 100)&&(id[i]>=10)){ id[i] <- paste("0",id[i], sep = "") } print(id[i]) } } Attach_zero(id) ##[1] "001" ##[1] "2" ##[1] "3" ##[1] "6" ##[1] "7" ##[1] "8" ##[1] "9" ##[1] "010" ##[1] "11" ,则会显示出意外的结果。 只需更正您的函数以包含id的所有元素:

Attach_zero <- function(id){
 return(sprintf('%03d', id)) #You can change return for print if you want
}
Attach_zero(id)
## [1] "001" "002" "003" "006" "007" "008" "009" "010" "011"

请注意此输出中的数字7。 并使用sprintf作为jbaums说,将其包含在函数中:

{{1}}