如何使用R的sprintf函数创建固定宽度的字符串并在末尾填充空格?

20

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

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

但是我如何获取字符串末尾的额外空白?

请注意,我听说过gdata软件包中的write.fwf非常好用,但在这种情况下并没有太大帮助,因为我需要编写一个非常特定的非标准格式,以供一个过时的旧程序使用。

3个回答

25

在数字8前面添加一个减号,以获得左对齐的填充字符串。


真的,但不是OP所要求的。 - Dirk Eddelbuettel
3
这不是吗?他写道:“但我如何在字符串结尾处获得额外的空格?”或者我有些混淆了吗? - Bernd Elkemann
1
@DirkEddelbuettel,原帖确实要求保留末尾的空格,所以我认为这符合要求。 - James
1
这正是我想要的。感谢帮助一位 C 语言新手。我只能选择一个答案,但我已经点赞了两个。感谢您的帮助和额外提供的信息。 - Matt Bannert
1
你是正确的 - 我从他的例子中误读了。他得到了左填充,而我以为他想要左填充。我的错,抱歉。这是一个措辞不当的问题。 - Dirk Eddelbuettel
@DirkEddelbuettel “他得到了左填充,我以为他想要左填充。” 好的……;-) - KomodoDave

12

这几乎更像是一个标准的"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所要求的内容后进行了更新。


有没有一种直接的方法可以使用sprintf()添加尾随的0而不是空格?我目前正在将结果包装在gsub(" ", "0", ...)中,这感觉有点麻烦。 - fdetsch

1
"

stringr包提供了str_pad函数:

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

这段文本的意思是:“产生以下结果:”
[1] "fjdlksa01dada" "rau     "      "sjklf   "

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接