我正试图将2009年分成2 0 0 9.
int2v<-function(n){
+ digits<-floor(log10(n))+1
+ i<-1
+ repeat{
+ n[i]<-n%%10^(digits-i+1)%/%10^(digits-i)
+ i<-i+1
+ if(i>digits) break
+ }
+ n
+ }
> int2v(2009)
[1] 2 0 0 2
Warning messages:
1: In n[i] <- n%%10^(digits - i + 1)%/%10^(digits - i) :
number of items to replace is not a multiple of replacement length
2: In n[i] <- n%%10^(digits - i + 1)%/%10^(digits - i) :
number of items to replace is not a multiple of replacement length
我无法得到答案2 0 0 9但有一些警告信息。 但我无法想到这个功能中的任何错误。 所以,任何人都可以帮助我吗?非常感谢。
答案 0 :(得分:2)
这实际上可以通过内置函数完成:
n<-2009
as.numeric(unlist(strsplit(as.character(n),"")))
[1] 2 0 0 9
as.character
将数字n
转换为字符串。 strsplit
将结果字符串拆分,第二个参数转换为strsplit
,使得每个字符都会发生此拆分。 unlist
将strsplit
生成的列表折叠为向量,as.numeric
转换回数字(而不是字符)向量。
如果n
不是数字开头,这将无效(显然!)如果将此代码包装在函数中,则可能需要测试此前置条件。值得注意的是,这不适用于n
中的数字向量,因为unlist
会将它们全部折叠为一个字符串。但延伸到这些情况(如果需要的话)不应该太难。
答案 1 :(得分:0)
使用您的代码
int2v<-function(n){
digits<-floor(log10(n))+1
i<-1
n1 <- c()
repeat{
n1<-c(n1,n%%10^(digits-i+1)%/%10^(digits-i))
i<-i+1
if(i>digits) break
}
n1
}
int2v(2009)
#[1] 2 0 0 9
int2v(20)
#[1] 2 0