R:要替换的项目数量不是替换的倍数

时间:2014-11-17 10:55:30

标签: r integer digits

我正试图将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但有一些警告信息。 但我无法想到这个功能中的任何错误。 所以,任何人都可以帮助我吗?非常感谢。

2 个答案:

答案 0 :(得分:2)

这实际上可以通过内置函数完成:

n<-2009
as.numeric(unlist(strsplit(as.character(n),"")))
[1] 2 0 0 9

as.character将数字n转换为字符串。 strsplit将结果字符串拆分,第二个参数转换为strsplit,使得每个字符都会发生此拆分。 unliststrsplit生成的列表折叠为向量,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