【问题标题】:R code to generate unique ID with prefix? [duplicate]R代码生成带有前缀的唯一ID? [复制]
【发布时间】:2017-02-18 06:19:09
【问题描述】:

我有一个名为“pipel”的表,其中包含超过 10,000 行。我想添加一个 ID 列来为每一行分配一个唯一的 ID。唯一 ID 的长度必须为 30 位,并以“AKM_CC_Test_”开头。我使用下面的代码作为起点,但不确定如何格式化它以添加前缀并使其长度为 30 位。

id <- rownames(pipel)
pipel <- cbind(id=id, pipel)

例如,第一行 ID 需要看起来像这样 AKM_CC_Test_000000000000000001

【问题讨论】:

  • 试试stringr::str_pad("1", 30, pad="0")

标签: r


【解决方案1】:

您可以使用sprintf()。这将创建一个 30 个字符的字符串,以 "AKM_CC_Test_" 开头并以 1:nrow(pipel) 的序列结尾,并带有前导零。

x <- "AKM_CC_Test_"
sprintf("%s%0*d", x, 30 - nchar(x), 1:nrow(pipel))
  • %sx 插入到字符串中
  • %0*dx 之后添加1:nrow(pipel)* 前导零。 * 用于将 30 - nchar(x) 插入到格式中(我以编程方式完成;如果需要,您可以在其中插入 18)

一个简单的长度为 5 (1:5) 向量的例子是

x <- "AKM_CC_Test_"
sprintf("%s%0*d", x, 30 - nchar(x), 1:5)
# [1] "AKM_CC_Test_000000000000000001" "AKM_CC_Test_000000000000000002"
# [3] "AKM_CC_Test_000000000000000003" "AKM_CC_Test_000000000000000004"
# [5] "AKM_CC_Test_000000000000000005"

【讨论】:

  • 感谢上面的代码工作并创建了我正在寻找的 ID,但是当我尝试使用 write.table(pipel, "pipel9.txt", sep=" ",quote = FALSE, col.names=TRUE) ID 列未显示在表中。
  • @Curious - 你用什么代码来添加列?
  • @Rich Scriven- 我尝试使用:newtable
【解决方案2】:

您可以将:seq 用于序列,并且可以在前导文本前添加pastepaste0。问题的核心在于以 0 开头的数字填充。

您的选择是:

  1. stri_pad 来自 stringi(更直观)
  2. str_pad 来自 stringr(更直观)
  3. sprintf(无需包)
  4. formatC(如果你熟悉 C 语言,那就太好了printf

请注意,尽管不是这种特殊情况,但有些情况需要禁用序列中数字的科学记数法。这可以通过来自devtoolsoptionswith_options 来完成。

请参阅this popular post 了解每个示例。

使用formatC

uid <- paste0("AKM_CC_Test_", formatC(1:10000, width = 18, format = "d", flag = "0"))
head(uid)
[1] "AKM_CC_Test_000000000000000001" "AKM_CC_Test_000000000000000002" "AKM_CC_Test_000000000000000003" "AKM_CC_Test_000000000000000004"
[5] "AKM_CC_Test_000000000000000005" "AKM_CC_Test_000000000000000006"

使用stringr 包:

uid <- paste0("AKM_CC_Test_", str_pad(1:10000, 18, pad = "0")) # remember to load stringr
head(uid)
[1] "AKM_CC_Test_000000000000000001" "AKM_CC_Test_000000000000000002" "AKM_CC_Test_000000000000000003" "AKM_CC_Test_000000000000000004"
[5] "AKM_CC_Test_000000000000000005" "AKM_CC_Test_000000000000000006"

使用sprintf

head(sprintf("%s%0*d", "AKM_CC_Test_", 18,  1:10000))
[1] "AKM_CC_Test_000000000000000001" "AKM_CC_Test_000000000000000002" "AKM_CC_Test_000000000000000003" "AKM_CC_Test_000000000000000004"
[5] "AKM_CC_Test_000000000000000005" "AKM_CC_Test_000000000000000006"

使用 stringi 包中的 stri_pad

uid <- paste0("AKM_CC_Test_", stri_pad(1:10000, 18, pad = "0")) # remember to load stringi
head(uid)
[1] "AKM_CC_Test_000000000000000001" "AKM_CC_Test_000000000000000002" "AKM_CC_Test_000000000000000003" "AKM_CC_Test_000000000000000004"
[5] "AKM_CC_Test_000000000000000005" "AKM_CC_Test_000000000000000006"

【讨论】:

  • 你为什么把我的答案加到你的上面?
  • @RichScriven 你在说什么?我使用链接帖子上的填充选项列表,我做了不同的事情并比较/对比它们。这只是一个函数 Rich,这不是你的答案。
  • 哦,变得真实。是一样的。
  • @RichScriven 哇。我只能说哇。我在你前面回答,将一个来源与一个选项列表链接起来,并一个一个地应用它们,你会抱怨和否决,因为你使用的一个选项在著名的列表中?还有其他我应该知道的禁区吗?我还能用&lt;-paste吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多