【问题标题】:R: number of items to replace is not a multiple of replacementR:要替换的项目数不是替换的倍数
【发布时间】:2014-11-17 10:55:30
【问题描述】:

我正在尝试将 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 但有一些警告信息。 但我想不出函数中有任何错误。 那么,任何人都可以帮助我吗?非常感谢。

【问题讨论】:

  • 也许你想要as.numeric(strsplit(as.character(2009), '')[[1]])

标签: r integer digits


【解决方案1】:

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

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 会将它们全部折叠成一个字符串。但是扩展到这些情况(如果需要的话)应该不会太难。

【讨论】:

    【解决方案2】:

    使用您的代码

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多