如何将打印的向量列与 sprintf (R) 对齐
How do I align printed columns of vectors with sprintf (R)
假设我在 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
如果不在 R 中进行大量混乱的编程,我无法弄清楚如何使用 sprintf 执行此操作。是否有使用 sprintf 在 R 中执行此操作的直接方法?使用“格式?”我很感激 link 一个好的 sprintf 教程。提前致谢。
你可以像在 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;
}
不完全漂亮,但有效:
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
如果您将向量定义为具有统一列内格式的列而不是具有行内差异的行,它会变得更清晰一些。
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 "
这只是计算多少的问题,在本例中为 7,基于字符串的字符数 nchar
假设我在 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
如果不在 R 中进行大量混乱的编程,我无法弄清楚如何使用 sprintf 执行此操作。是否有使用 sprintf 在 R 中执行此操作的直接方法?使用“格式?”我很感激 link 一个好的 sprintf 教程。提前致谢。
你可以像在 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;
}
不完全漂亮,但有效:
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
如果您将向量定义为具有统一列内格式的列而不是具有行内差异的行,它会变得更清晰一些。
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 "
这只是计算多少的问题,在本例中为 7,基于字符串的字符数 nchar