【问题标题】:adding a variable length padding to each element in a string/character vector向字符串/字符向量中的每个元素添加可变长度填充
【发布时间】:2021-04-26 18:29:25
【问题描述】:

我对 R 不是很了解,但对其他几种语言有一定的了解,并且对此有解决方案,但我想知道是否有更有效的方法,因为我计划将其用于大型列表。我在网上看了几次,厌倦了各种各样的事情,没有运气,this answer 可能是答案,但我似乎无法让它发挥作用。

我有一个来自外部文件的字符串列表,每个字符串的每个元素中可能包含不同数量的字符。我想填充这个列表(带有尾随空格),以便所有元素都具有相同的长度。我将在示例中使用“+”代替空格以进行澄清。所以

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)

【问题讨论】:

    标签: r string padding


    【解决方案1】:

    向量化的基础 R 选项:

    vec <- c("dog", "cat", "mouse", "hare", "snake") 
    n <- max(nchar(vec))
    paste0(vec, strrep('+', n - nchar(vec)))
    #[1] "dog++" "cat++" "mouse" "hare+" "snake"
    

    【讨论】:

    • 非常感谢,这正是我所需要的。比我基于少数测试的原始解决方案更优雅,速度大约是原来的两倍。谢谢
    【解决方案2】:

    一个基本的 R 解决方案,在 replaceing NAs 后用“+”分割字符串、调整长度和 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") 
    

    【讨论】:

      【解决方案3】:

      一个stringr 选项可以是:

      str_pad(x, max(nchar(x)), pad = "+", side = "right")
      
      [1] "dog++" "cat++" "mouse" "hare+" "snake"
      

      【讨论】:

        猜你喜欢
        • 2011-03-08
        • 1970-01-01
        • 2021-11-12
        • 1970-01-01
        • 2020-12-31
        • 1970-01-01
        • 2021-04-26
        • 2012-12-29
        • 1970-01-01
        相关资源
        最近更新 更多