需要在所有具有特定字符长度的元素的特定位置添加 0
Need to add 0 to specific location of all elements that have a specific character length
很多关于如何添加前导 0 的答案,但我的情况是这样的:
我有一个数据框,其中第一列是患者 ID,对于只有 3 个字符的数据框,我需要在 ID 的第二个字符上添加 0:
patientIDs <- c("E015", "E04", "E212") #what I have
patientIDsnew <- c("E015", "E004", "E212") #what I need
hr <- c(110, 105, 135)
df <- data.frame(patientIDs,patientIDsnew, hr)
我想我需要设置一个 ifelse 来计算 str_length,如果 <4,它会添加零...但不确定第一部分如何:
library(stringr)
df$patientIDsnew <- ifelse(str_length(df$patientIDs) < 4,
我们可以尝试使用 sub
作为基础 R 选项:
patientIDs <- c("E015", "E04", "E212")
patientIDsnew <- sub("^([A-Z])(\d{2})$", "\10\2", patientIDs, perl=TRUE)
patientIDsnew
[1] "E015" "E004" "E212"
这里的想法是在单独的捕获组中匹配和捕获前导字母以及尾随的两位数字(3 位数字 ID 将不匹配)。然后,我们可以通过添加填充零来替换。
这是一个效率较低的版本,因为我不擅长正则表达式。在 'E' 拆分 ID。然后,如果任何数字 ID 的长度小于 3,则添加一个零。然后把它们重新组合起来。
patientIDs %>%
str_split_fixed("", n = 2) %>%
as_tibble() %>%
mutate(V2 = if_else(str_length(V2) < 3, str_pad(V2, side = "left", width = 3, pad = "0"), V2)) %>%
mutate(new = str_c(V1, V2))
我们可以得到少于4个字符的patientIDs
,根据它们的位置打断字符串并粘贴在一起。
patientIDsnew <- patientIDs
inds <- nchar(patientIDsnew) < 4
patientIDsnew[inds] <- paste0(substr(patientIDsnew[inds], 1, 1), 0,
substr(patientIDsnew[inds], 2,4))
patientIDsnew
#[1] "E015" "E004" "E212"
很多关于如何添加前导 0 的答案,但我的情况是这样的:
我有一个数据框,其中第一列是患者 ID,对于只有 3 个字符的数据框,我需要在 ID 的第二个字符上添加 0:
patientIDs <- c("E015", "E04", "E212") #what I have
patientIDsnew <- c("E015", "E004", "E212") #what I need
hr <- c(110, 105, 135)
df <- data.frame(patientIDs,patientIDsnew, hr)
我想我需要设置一个 ifelse 来计算 str_length,如果 <4,它会添加零...但不确定第一部分如何:
library(stringr)
df$patientIDsnew <- ifelse(str_length(df$patientIDs) < 4,
我们可以尝试使用 sub
作为基础 R 选项:
patientIDs <- c("E015", "E04", "E212")
patientIDsnew <- sub("^([A-Z])(\d{2})$", "\10\2", patientIDs, perl=TRUE)
patientIDsnew
[1] "E015" "E004" "E212"
这里的想法是在单独的捕获组中匹配和捕获前导字母以及尾随的两位数字(3 位数字 ID 将不匹配)。然后,我们可以通过添加填充零来替换。
这是一个效率较低的版本,因为我不擅长正则表达式。在 'E' 拆分 ID。然后,如果任何数字 ID 的长度小于 3,则添加一个零。然后把它们重新组合起来。
patientIDs %>%
str_split_fixed("", n = 2) %>%
as_tibble() %>%
mutate(V2 = if_else(str_length(V2) < 3, str_pad(V2, side = "left", width = 3, pad = "0"), V2)) %>%
mutate(new = str_c(V1, V2))
我们可以得到少于4个字符的patientIDs
,根据它们的位置打断字符串并粘贴在一起。
patientIDsnew <- patientIDs
inds <- nchar(patientIDsnew) < 4
patientIDsnew[inds] <- paste0(substr(patientIDsnew[inds], 1, 1), 0,
substr(patientIDsnew[inds], 2,4))
patientIDsnew
#[1] "E015" "E004" "E212"