如何使用sprintf(R)对齐打印的矢量列

时间:2015-03-24 18:49:34

标签: c r formatting

假设我在R中有3个向量:

x <- c("xskdlfl", "  y", "lkjsf")
y <- c(22.5, 6, 7.0)
z <- c("slk","llkjdf", "xx")

我想生成一个格式化的表格输出,最右边的字符在除第一列之外的所有列中都是这样排列的:

xskdlfl        y     lkjsf
22.5         5.6       7.0
slk       llkjdf        xx

我无法弄清楚如何使用sprintf执行此操作而不需要在R中进行大量混乱编程。在使用sprintf的R中是否有直接的方法来执行此操作?使用'格式?'我很欣赏一个好的sprintf教程的链接。提前谢谢。

3 个答案:

答案 0 :(得分:4)

x <- c("xskdlfl", "  y", "lkjsf")
y <- c(22.5, 6, 7.0)
z <- c("slk","llkjdf", "xx")

(dat <- setNames(data.frame(rbind(x, y, z)), c('x','y','z')))

#         x      y     z
# x xskdlfl      y lkjsf
# y    22.5      6     7
# z     slk llkjdf    xx

with(dat, data.frame(x = sprintf(paste0('%-', max(nchar(x)), 's'), x), y, z))

#         x      y     z
# 1 xskdlfl      y lkjsf
# 2 22.5         6     7
# 3 slk     llkjdf    xx

您可以在字符串的左侧或右侧添加填充,如下所示:

sprintf('%7s', z)
# [1] "    slk" " llkjdf" "     xx"

sprintf('%-7s', z)
# [1] "slk    " "llkjdf " "xx     "

在这种情况下,根据字符串nchar的字符数来确定多少,这只是一个问题

答案 1 :(得分:2)

不完全漂亮但有效:

mat = rbind(x, y, z)

for (i in 1:ncol(mat)) {
    mat[, i] = format(mat[, i], justify = ifelse(i == 1, "left", "right"))
}

mat
#   [,1]      [,2]     [,3]   
# x "xskdlfl" "     y" "lkjsf"
# y "22.5   " "     6" "    7"
# z "slk    " "llkjdf" "   xx"

row.names(mat) = NULL
noquote(mat)
#      [,1]    [,2]   [,3] 
# [1,] xskdlfl      y lkjsf
# [2,] 22.5         6     7
# [3,] slk     llkjdf    xx

如果您将向量定义为具有统一列内格式的列而不是具有行内差异的行,则会更清晰。

答案 2 :(得分:0)

你可以像在C中一样使用sprintf,这样:

int main(){
    char a[] = "azerty";
    char b[] = "qsdfghjkl";
    char c[] = "wxcvbn,;:!";
    printf ("%-20s\t%20s\t%20s\n", a, b, c);
    printf ("%-20s\t%20s\t%20s\n", b, c, a);
    printf ("%-20s\t%20s\t%20s\n", c, a, b);
    return 0;
}