【问题标题】:How to use R's sprintf to create fixed width strings with fill whitespace at the END?如何使用 R 的 sprintf 创建固定宽度的字符串,并在 END 处填充空白?
【发布时间】:2012-03-04 22:33:29
【问题描述】:

我有字符串向量,想用字符串创建一个固定的向量。较短的字符串应该用空格填充。例如:

c("fjdlksa01dada","rau","sjklf")
sprintf("%8s")
# returns
[1] "fjdlksa01dada" "     rau"      "   sjklf"

但是我怎样才能在字符串的末尾获得额外的空格呢?

请注意,我从gdata 包中听说过 write.fwf,它非常好,但在这种情况下并没有多大帮助,因为我需要为一个过时的旧程序编写一个非常具体的非标准格式。

【问题讨论】:

    标签: r formatting output printf


    【解决方案1】:

    在 8 前面加一个减号得到一个左对齐的填充字符串

    【讨论】:

    • 是的,但不是 OP 要求的。
    • 不是吗?他写道:“但是我怎样才能在字符串的末尾获得额外的空格?”还是我有什么困惑?
    • @DirkEddelbuettel OP 确实要求最后的空格,所以我认为这很合适
    • 这正是我想要的。感谢您帮助 C 新手。我只能 +acc 一个答案,但 +1`d 两个。感谢您的帮助和其他信息。
    • 你是对的——我误读了他的例子。他得到了左填充,我认为他想要左填充。我的错,对不起。这是一个措辞不当的问题。
    【解决方案2】:

    这几乎是一个标准的“C”而不是 R 问题,因为它与 printf 格式字符串有关。您甚至可以在命令提示符下进行测试:

    edd@max:~$ printf "[% 8s]\n" foo
    [     foo]
    edd@max:~$ printf "[%-8s]\n" foo
    [foo     ]
    edd@max:~$ 
    

    在 R 中,左填充同样适用:

    R> vec <- c("fjdlksa01dada","rau","sjklf")
    R> sprintf("% 8s", vec)
    [1] "fjdlksa01dada" "     rau"      "   sjklf"     
    R> 
    

    对了

    R> sprintf("%-8s", vec)
    [1] "fjdlksa01dada" "rau     "      "sjklf   "     
    R> 
    

    编辑:在我更好地理解@ran2 实际要求的内容后更新。

    【讨论】:

    • 有没有直接的方法来添加尾随0s 而不是使用sprintf() 的空格?我目前正在将结果包装在gsub(" ", "0", ...) 中,感觉有点麻烦。
    【解决方案3】:

    stringr 包提供str_pad:

    library(stringr)
    x <- c("fjdlksa01dada","rau","sjklf")
    str_pad(x, width=8, side="right")
    

    产生:

    [1] "fjdlksa01dada" "rau     "      "sjklf   "
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-17
      • 1970-01-01
      相关资源
      最近更新 更多