向 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 之后拆分字符串,同时调整长度和 paste0s。

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"