如何使用 dplyr 管道将前导零添加到数据框列中的 select 行

How to add leading zeros to select rows in a data frame column using dplyr pipes

考虑在此处创建 data

data <- data.frame(ID = sample(10000,100), not.imp1 = rnorm(100), not.imp2 = rnorm(100), not.imp3 = rnorm(100))
#Note that not all IDs are the same length

我们有 100 ID 秒的数据,其中每个人都有一个唯一的 ID 编号。列 not.imp1:3 仅与显示数据框的结构相关。 我们想在前 95 个 ID 数字前添加一个前导零。我正在尝试使用 dplyr 管道来执行此操作,但无法弄清楚如何添加零。 以下是我如何对要添加零的数据进行子集化:

library(dplyr)
data%>%
select(ID)%>%
slice(1:95)

我已经尝试了几种方法,例如将 %>%mutate(paste0("0",.)) 添加到管道中,但没有任何效果。最好的方法是什么?

这是一种快速简便的方法。我没有使用 dplyrpipeing,但如果你愿意,你可以将这个想法与你已经尝试过的代码合并。

data[which(nchar(data[,"ID"])==3),"ID"]<-paste0(0,data[which(nchar(data[,"ID"])==3),"ID"])
data[which(nchar(data[,"ID"])==2),"ID"]<-paste0(00,data[which(nchar(data[,"ID"])==2),"ID"])

使用sprintf()填充到3位:

data %>% mutate(ID = sprintf("%03d", ID))

您可以更改 %03d 以更改要添加的前导零的数量。例如。 %05d 将确保所有 ID 的长度至少为 5 位。

使用 str_pad 很有帮助

data <- data.frame(ID = sample(10000,100), not.imp1 = rnorm(100), not.imp2 = rnorm(100), not.imp3 = rnorm(100)) %>% 
  mutate(ID = str_pad(string = ID, width = 4, side = 'left', pad = 0))

你可以试试这个方法

data2 <- data %>% 
  mutate(ID = ifelse(row_number()<= 95, paste0("0", ID), ID))

head(data2)
#     ID   not.imp1   not.imp2   not.imp3
# 1 09449 -1.4297317 -2.2210106  0.1923912
# 2 07423  1.9010681  1.0825734 -0.8855694
# 3 06283  0.2508254 -0.5307967  2.1645044
# 4 05593 -2.2451267  0.1281156 -1.8528800
# 5 09194 -0.1677409 -0.7422480 -0.4237452
# 6 07270 -0.2536918  1.2289698  1.0083092
tail(data2)
#       ID   not.imp1   not.imp2   not.imp3
# 95  06538  1.0071791  0.1596557 -0.7099883
# 96   4829  0.2444440  0.8869954 -1.2938356
# 97   2571 -1.1012023  0.8343393 -0.6264487
# 98    150  0.2116460 -0.2146265 -1.8281045
# 99   3107 -1.2379193  0.3491078  1.4531531
# 100  9953 -0.9326725  1.1146032 -1.5542687