如何使用 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",.))
添加到管道中,但没有任何效果。最好的方法是什么?
这是一种快速简便的方法。我没有使用 dplyr
或 pipeing
,但如果你愿意,你可以将这个想法与你已经尝试过的代码合并。
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
考虑在此处创建 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",.))
添加到管道中,但没有任何效果。最好的方法是什么?
这是一种快速简便的方法。我没有使用 dplyr
或 pipeing
,但如果你愿意,你可以将这个想法与你已经尝试过的代码合并。
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