for循环中的If语句不限定R中的向量
我在R中编写了一个函数来附加零,这样1到100之间的任何数字都会显示为001(1)、010(10)和100(100),但我无法理解为什么if语句不能像我希望的那样进行限定for循环中的If语句不限定R中的向量,r,loops,for-loop,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 = "")
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])
}
}
id这里的问题是您将字符串(例如“001”)分配给数字向量。执行此操作时,整个id
向量将转换为字符
(向量的元素必须为一种类型)
因此,在将1
与10
进行比较并将“001”
分配给id[1]
之后,id
的下一个元素是“2”
(即字符2)。当不等式包含字符元素(例如“2”<10
)时,数字部分强制为字符,字母排序规则适用。这些规则意味着“100”
和“10”
都位于“2”
之前,因此如果条件满足,则您的。除10
以外的所有数字都是这种情况,根据字母排序,该数字小于100
,因此,如果满足条件,则第二个。当您到达11
时,两个条件都不会再次满足,因为“word”“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))
ifelse(id<10,粘贴0('00',id),ifelse(id<100,粘贴0('0',id),id))
这里的问题是,您正在将字符串(例如“001”)分配给数字向量。执行此操作时,整个id
向量将转换为字符
(向量的元素必须为一种类型)
因此,在将1
与10
进行比较并将“001”
分配给id[1]
之后,id
的下一个元素是“2”
(即字符2)。当不等式包含字符元素(例如“2”<10
)时,数字部分强制为字符,字母排序规则适用。这些规则意味着“100”
和“10”
都位于“2”
之前,因此如果条件满足,则您的。除10
以外的所有数字都是这种情况,根据字母排序,该数字小于100
,因此,如果满足条件,则第二个。当您到达11
时,两个条件都不会再次满足,因为“word”“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))
ifelse(id<10,粘贴0('00',id),ifelse(id<100,粘贴0('0',id),id))
这里的问题是,您正在将字符串(例如“001”)分配给数字向量。执行此操作时,整个id
向量将转换为字符
(向量的元素必须为一种类型)
因此,在将1
与10
进行比较并将“001”
分配给id[1]
之后,id
的下一个元素是“2”
(即字符2)。当不等式包含字符元素(例如“2”<10
)时,数字部分强制为字符,字母排序规则适用。这些规则意味着“100”
和“10”
都位于“2”
之前,因此如果条件满足,则您的。除10
以外的所有数字都是这种情况,根据字母排序,该数字小于100
,因此,如果满足条件,则第二个。当您到达11
时,两个条件都不会再次满足,因为“word”“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))
ifelse(id<10,粘贴0('00',id),ifelse(id<100,粘贴0('0',id),id))
这里的问题是,您正在将字符串(例如“001”)分配给数字向量。执行此操作时,整个id
向量将转换为字符
(向量的元素必须为一种类型)
因此,在将1
与10
进行比较并将“001”
分配给id[1]
之后,id
的下一个元素是“2”
(即字符2)。当不等式包含字符元素(例如“2”<10
)时,数字部分强制为字符,字母排序规则适用。这些规则意味着“100”
和“10”
都位于“2”
之前,因此如果条件满足,则您的。除10
以外的所有数字都是这种情况,根据字母排序,该数字小于100
,因此,如果满足条件,则第二个。当您到达11
时,两个条件都不会再次满足,因为“word”“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))
ifelse(id<10,粘贴0'00',id),ifelse(id<100,粘贴0'0',id),id)