добавление отступов переменной длины к каждому элементу в векторе строки / символа

Я не очень разбираюсь в R, но знаю достаточно много о нескольких других языках и у меня есть решение для этого, но я хочу знать, есть ли более эффективный способ, поскольку я планирую использовать его для больших списков. Я смотрел в Интернете несколько раз и безуспешно устал от разных вещей, этот ответ может быть ответом, но я не могу заставить его работать.

У меня есть список строк из внешнего файла, каждая из которых потенциально имеет разное количество символов в каждом элементе. Я хотел бы дополнить этот список (конечным пробелом), чтобы все элементы имели одинаковую длину. Я буду использовать "+" вместо пробела в примере для пояснения. Так

c(“dog”, “cat”, “mouse”, “hare”, “snake”) 

станет

[1] “dog++”, “cat++", “mouse”, “hare+”, “snake”

То, что у меня есть, работает, но я думаю, что будет более эффективное и элегантное решение с использованием пасты, репродукции или аналогичного. 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)

person Spencer Thomas    schedule 22.01.2021    source источник


Ответы (3)


Вариант векторизованной базы R:

vec <- c("dog", "cat", "mouse", "hare", "snake") 
n <- max(nchar(vec))
paste0(vec, strrep('+', n - nchar(vec)))
#[1] "dog++" "cat++" "mouse" "hare+" "snake"
person Ronak Shah    schedule 22.01.2021
comment
большое спасибо, это именно то, что мне нужно. Намного более элегантно и примерно в два раза быстрее, чем мое первоначальное решение, основанное на нескольких тестах. Спасибо - person Spencer Thomas; 22.01.2021

Один stringr вариант может быть:

str_pad(x, max(nchar(x)), pad = "+", side = "right")

[1] "dog++" "cat++" "mouse" "hare+" "snake"
person tmfmnk    schedule 22.01.2021

Базовое решение R, которое разбивает строки, регулирует длины и paste0 вместе после replace добавления NA с помощью +.

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") 
person jay.sf    schedule 22.01.2021