我在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循环跳过中间整数。
答案 0 :(得分:1)
这里的问题是您要将字符串(例如&#34; 001&#34;)分配给数字向量。执行此操作时,整个id
向量将转换为character
(向量的元素必须为一种类型)。
因此,在将1
与10
进行比较并将"001"
分配给id[1]
之后,id
的下一个元素是"2"
(即字符2)。当不等式包括字符元素(例如"2" < 10
)时,数字部分被强制转换为字符,并且应用字母排序规则。这些规则意味着"100"
和"10"
都位于"2"
之前,因此您的if
条件都不会满足。对于除10
之外的所有数字都是如此,根据字母排序小于100
,因此满足您的第二个if
条件。当你到达11
时,两个条件都不会再次遇到,因为&#34;字&#34; "11"
位于"100"
之后。
虽然有几种方法可以修复您的功能,但R中存在此功能(如评论中所述),包括sprintf
和formatC
。
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}}