如何将前导数字标识符(不一定为零)添加到 r 中的字符串

Posted

技术标签:

【中文标题】如何将前导数字标识符(不一定为零)添加到 r 中的字符串【英文标题】:How to I add a leading numeric identifier (not necessarily zero) to a character string in r 【发布时间】:2018-10-02 12:24:00 【问题描述】:

如果这是重复的,我深表歉意,我已经搜索了所有我能找到的“添加前导零”内容,我正在努力寻找一个我可以使用的解决方案。我有以下内容:

siteid<-c("1","11","111")
modifier<-c("44","22","11")
df<-data.frame(siteid,modifier)

我想要一个修改后的siteid,它总是六 (6) 个字符长,用零填充空白。 nchar 中的站点 ID 可以从 1 到 3 变化,修饰符的长度始终为 2,零的数量可以根据站点 ID 的长度而变化(因此 6 始终是最终修改的长度)。

我想要以下最终输出:

df
#  siteid modifier mod.siteid
#1      1       44     440001
#2     11       22     220011
#3    111       11     110111

感谢您的任何建议或指导。这也可以是数字,但似乎字符操作有更多选择...?

【问题讨论】:

【参考方案1】:

这里的词汇是 left padpaste 这里是使用sprintf():: 的一种方式@::

df$mod.siteid <- with(df, sprintf("%s%04d", modifier, as.integer(siteid)))

# Note: 
# code simplified thanks to suggestion by Maurits.

输出:

      siteid modifier mod.siteid
1      1       44     440001
2     11       22     220011
3    111       11     110111

数据

df <- data.frame(
  siteid   = c("1", "11", "111"),
  modifier = c("44", "22", "11"),
  stringsAsFactors = FALSE
)  

额外:如果您不想留下0,那么使用stringi 包是一种选择:with(df, paste0(modifier, stringi::stri_pad_left(siteid, 4, "q")))

【讨论】:

或者一次完成所有事情 sprintf 呼叫:with(df, sprintf("%s%04d", modifier, as.integer(siteid))) 我喜欢这个,谢谢。我对其进行了一些修改,以包含 df$mod.siteid&lt;-ifelse(nchar(siteid)&lt;6,with(df,sprintf("%s%04d",modifier,as.integer(mod.siteid))),siteid) 以说明存在的完整站点 ID。【参考方案2】:
siteid<-c("1","11","111")
modifier<-c("44","22","11")
df<-data.frame(siteid,modifier, stringsAsFactors = FALSE)

df$mod.siteid = paste0( df$modifier, 
                        formatC( as.numeric(df$siteid), width = 4, format = "d", flag="0") )

df

#   siteid modifier mod.siteid
# 1      1       44     440001
# 2     11       22     220011
# 3    111       11     110111

【讨论】:

以上是关于如何将前导数字标识符(不一定为零)添加到 r 中的字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何有条件地将前导零添加到一列数字?

R如何添加前导零而不是空格[重复]

从R中的字母数字字符中删除前导零

如何从字母数字文本中删除前导零?

Python将前导零添加到时间字段[重复]

将前导零添加到 Spark 数据框中的列 [重复]