向 string/character 向量中的每个元素添加可变长度填充
adding a variable length padding to each element in a string/character vector
我对 R 不太了解,但对其他一些语言了解相当多,并且有解决方案,但我想知道是否有更有效的方法,因为我计划将其用于大型列表.我在网上看了几次,累了各种事情都没有运气, 可能是答案,但我似乎无法让它工作。
我有一个来自外部文件的字符串列表,每个字符串的每个元素中可能包含不同数量的字符。我想填充此列表(尾随白色 space),以便所有元素具有相同的长度。我将在示例中使用“+”代替白色 space 以进行说明。所以
c(“dog”, “cat”, “mouse”, “hare”, “snake”)
会变成
[1] “dog++”, “cat++", “mouse”, “hare+”, “snake”
我的方法有效,但我认为使用 paste、rep 或类似方法会有更高效、更优雅的解决方案。 Y 是我的角色列表
# find max length of elements
maxY <- max(nchar(Y))
# size of padding to each element
Ydif <- max(nchar(Y)) - nchar(Y)
# pad each string element with the required amount of white space
for (l in 1:length(Ydif)) {
if (Ydif[l] > 0) {
Ypad[l] = strrep(" ", times=Ydif[l])
} else {
Ypad[l] = "" # if zero dont add padding
}
}
# combine the padding with the original list to get all the same length
paste0(Y,Ypad, collapse=NULL)
一个stringr
选项可以是:
str_pad(x, max(nchar(x)), pad = "+", side = "right")
[1] "dog++" "cat++" "mouse" "hare+" "snake"
一个基本的 R 解决方案,在 replace
带有“+”的 NA 之后拆分字符串,同时调整长度和 paste0
s。
o <- lapply(strsplit(x, ""), `length<-`, max(nchar(x)))
o <- sapply(o, function(o) Reduce(paste0, replace(o, is.na(o), "+")))
o
# [1] "dog++" "cat++" "mouse" "hare+" "snake"
(旁注: 不幸的是 strtrim(x, max(nchar(x)), fill="+")
不起作用,不过这将是一个很棒的功能。)
数据:
x <- c("dog", "cat", "mouse", "hare", "snake")
向量化的基础 R 选项:
vec <- c("dog", "cat", "mouse", "hare", "snake")
n <- max(nchar(vec))
paste0(vec, strrep('+', n - nchar(vec)))
#[1] "dog++" "cat++" "mouse" "hare+" "snake"
我对 R 不太了解,但对其他一些语言了解相当多,并且有解决方案,但我想知道是否有更有效的方法,因为我计划将其用于大型列表.我在网上看了几次,累了各种事情都没有运气,
我有一个来自外部文件的字符串列表,每个字符串的每个元素中可能包含不同数量的字符。我想填充此列表(尾随白色 space),以便所有元素具有相同的长度。我将在示例中使用“+”代替白色 space 以进行说明。所以
c(“dog”, “cat”, “mouse”, “hare”, “snake”)
会变成
[1] “dog++”, “cat++", “mouse”, “hare+”, “snake”
我的方法有效,但我认为使用 paste、rep 或类似方法会有更高效、更优雅的解决方案。 Y 是我的角色列表
# find max length of elements
maxY <- max(nchar(Y))
# size of padding to each element
Ydif <- max(nchar(Y)) - nchar(Y)
# pad each string element with the required amount of white space
for (l in 1:length(Ydif)) {
if (Ydif[l] > 0) {
Ypad[l] = strrep(" ", times=Ydif[l])
} else {
Ypad[l] = "" # if zero dont add padding
}
}
# combine the padding with the original list to get all the same length
paste0(Y,Ypad, collapse=NULL)
一个stringr
选项可以是:
str_pad(x, max(nchar(x)), pad = "+", side = "right")
[1] "dog++" "cat++" "mouse" "hare+" "snake"
一个基本的 R 解决方案,在 replace
带有“+”的 NA 之后拆分字符串,同时调整长度和 paste0
s。
o <- lapply(strsplit(x, ""), `length<-`, max(nchar(x)))
o <- sapply(o, function(o) Reduce(paste0, replace(o, is.na(o), "+")))
o
# [1] "dog++" "cat++" "mouse" "hare+" "snake"
(旁注: 不幸的是 strtrim(x, max(nchar(x)), fill="+")
不起作用,不过这将是一个很棒的功能。)
数据:
x <- c("dog", "cat", "mouse", "hare", "snake")
向量化的基础 R 选项:
vec <- c("dog", "cat", "mouse", "hare", "snake")
n <- max(nchar(vec))
paste0(vec, strrep('+', n - nchar(vec)))
#[1] "dog++" "cat++" "mouse" "hare+" "snake"