我有一组数据,看起来像这样:

anim <- c(25499,25500,25501,25502,25503,25504)
sex  <- c(1,2,2,1,2,1)
wt   <- c(0.8,1.2,1.0,2.0,1.8,1.4)
data <- data.frame(anim,sex,wt)

data
   anim sex  wt anim2
1 25499   1 0.8     2
2 25500   2 1.2     2
3 25501   2 1.0     2
4 25502   1 2.0     2
5 25503   2 1.8     2
6 25504   1 1.4     2

我想在每个动物id之前添加一个零:

data
   anim sex  wt anim2
1 025499   1 0.8     2
2 025500   2 1.2     2
3 025501   2 1.0     2
4 025502   1 2.0     2
5 025503   2 1.8     2
6 025504   1 1.4     2

为了方便起见,如果我需要在动物id前加两个或三个0呢?


当前回答

下面是一个可推广的基R函数:

pad_left <- function(x, len = 1 + max(nchar(x)), char = '0'){

    unlist(lapply(x, function(x) {
        paste0(
            paste(rep(char, len - nchar(x)), collapse = ''),
            x
        )
    }))
}

pad_left(1:100)

我喜欢sprintf,但它有如下警告:

然而,实际的实现将遵循C99标准,细节(特别是用户错误下的行为)可能取决于平台

其他回答

在其他情况下,你希望数字字符串是一致的,我做了一个函数。

有人可能会觉得这很有用:

idnamer<-function(x,y){#Alphabetical designation and number of integers required
    id<-c(1:y)
    for (i in 1:length(id)){
         if(nchar(id[i])<2){
            id[i]<-paste("0",id[i],sep="")
         }
    }
    id<-paste(x,id,sep="")
    return(id)
}
idnamer("EF",28)

对不起,格式不对。

下面是另一种将前导0添加到字符串(如cusip)的替代方法,它有时看起来像一个数字,许多应用程序(如Excel)将破坏并删除前导0或将其转换为科学符号。

当我尝试@metasequoia提供的答案时,返回的向量有前导空格,而不是0。这与@user1816679提到的问题相同——删除0周围的引号或将%d更改为%s也没有什么不同。仅供参考,我使用的是运行在Ubuntu服务器上的RStudio服务器。这个两步解决方案对我很管用:

gsub(pattern = “ ”, replace = “0”, x = sprintf(fmt = “%09s”, ids[,CUSIP]))

使用magrittr包中的%>% pipe函数,它看起来像这样:

sprintf(fmt = "%09s", ids[,CUSIP]) %>% gsub(pattern = " ", replace = "0", x = .)

我更喜欢一个功能单一的解决方案,但它确实可行。

data$anim <- sapply(0, paste0,data$anim)

下面是一个可推广的基R函数:

pad_left <- function(x, len = 1 + max(nchar(x)), char = '0'){

    unlist(lapply(x, function(x) {
        paste0(
            paste(rep(char, len - nchar(x)), collapse = ''),
            x
        )
    }))
}

pad_left(1:100)

我喜欢sprintf,但它有如下警告:

然而,实际的实现将遵循C99标准,细节(特别是用户错误下的行为)可能取决于平台

stringr包中的Str_pad是另一种选择。

anim = 25499:25504
str_pad(anim, width=6, pad="0")