如何在R data.table列的STOUT中有一个tabstop长度?

时间:2017-05-01 06:09:24

标签: r

我想在R data.table中更一致地显示数据的后续打印。 例如,在Vim中,您可以使用tapstopcsv.vim执行此操作。 代码

library(data.table)

# http://stackoverflow.com/a/43706344/54964

DF[time < 8]

# print other data
DF[time < 10]

第二列的位置因第二列(7.7到10.8)中项目长度不同而变化的输出

                      Z A_t AtPE
1:                    A 7.7 1.28
2:                    B 9.6 1.60
[1] other data
1:                    C  9.0 1.50
2:                    A 10.8 1.80

预期输出

                      Z  A_t AtPE
1:                    A  7.7 1.28
2:                    B  9.6 1.60
[1] other data
1:                    C  9.0 1.50
2:                    A 10.8 1.80

我的命令示例

field <- "Acute"
sprintf("%s ", field)
# http://stackoverflow.com/a/43714690/54964
cat(capture.output(unname(DF[order(time)][time < 15 & Field == field, .(Field)])[])[-1], sep="\n")

field <- "An"
sprintf("%s ", field)
cat(capture.output(unname(DF[order(time)][time < 15 & Field == field, .(Field)])[])[-1], sep="\n")

field <- "En"
sprintf("%s ", field)
cat(capture.output(unname(DF[order(time)][time < 15 & Field == field, .(Field)])[])[-1], sep="\n")

1 个答案:

答案 0 :(得分:2)

我们可以将其放在list中,然后通过一些调整来执行capture.output

v1 <- capture.output(lapply(list(DF[time < 8], DF[time < 10]), unname))
v2 <- v1[!grepl("\\[", v1)]
i1 <- v2=="" &  seq_along(v2) != length(v2)
v2[i1] <- sprintf("[%d] other data", seq_along(i1[i1]))

现在我们打印它

cat(v2[trimws(v2)!=""], sep="\n")
# 1: Acute 0.0  0 A 6 0.000000
# 2:    An 7.7 26 B 6 1.283333
# 3:    Fo 0.0  0 B 5 0.000000
# 4: Acute 7.5  1 C 6 1.250000
# 5:    An 7.9 43 C 6 1.316667
# 6:    En 0.0  0 C 6 0.000000
# 7:    Fo 5.4  1 C 5 1.080000
# 8:    An 7.8 77 D 6 1.300000
# 9:    En 0.0  0 D 6 0.000000
#10:    Fo 0.0  0 D 5 0.000000
#11: Acute 0.0  0 E 6 0.000000
#12:    An 7.9 60 E 6 1.316667
#13:    Fo 0.0  0 E 5 0.000000
#14:    Fo 7.9  3 F 5 1.580000
#[1] other data
# 1: Acute 0.0   0 A 6 0.000000
# 2:    An 9.0 120 A 6 1.500000
# 3:    Fo 9.2   2 A 5 1.840000
# 4: Acute 8.3   1 B 6 1.383333
# 5:    An 7.7  26 B 6 1.283333
# 6:    Fo 0.0   0 B 5 0.000000
# 7: Acute 7.5   1 C 6 1.250000
# 8:    An 7.9  43 C 6 1.316667
# 9:    En 0.0   0 C 6 0.000000
#10:    Fo 5.4   1 C 5 1.080000
#11: Acute 8.6   2 D 6 1.433333
#12:    An 7.8  77 D 6 1.300000
#13:    En 0.0   0 D 6 0.000000
#14:    Fo 0.0   0 D 5 0.000000
#15: Acute 0.0   0 E 6 0.000000
#16:    An 7.9  60 E 6 1.316667
#17:    Fo 0.0   0 E 5 0.000000
#18: Acute 8.3   4 F 6 1.383333
#19:    An 8.2 326 F 6 1.366667
#20:    Fo 7.9   3 F 5 1.580000

更新

我们需要明确调用justify中的format来对齐

v1 <- do.call(c, lapply(list(DF[time < 8], DF[time < 10]),
     function(x) capture.output(unname(x))))
v1 <- format(trimws(v1), width = max(nchar(v1)), justify = "right")
i1 <- trimws(v1)=="" & seq_along(v1) != 1
v1[i1] <- format(sprintf("[%d] other data", seq_along(i1[i1])),
           width = max(nchar(v1)), justify = "left")

现在,我们致电cat

cat(v1[-1], sep="\n")
#  1: Acute 0.0  0 A 6 0.000000
#  2:    An 7.7 26 B 6 1.283333
#  3:    Fo 0.0  0 B 5 0.000000
#  4: Acute 7.5  1 C 6 1.250000
#  5:    An 7.9 43 C 6 1.316667
#  6:    En 0.0  0 C 6 0.000000
#  7:    Fo 5.4  1 C 5 1.080000
#  8:    An 7.8 77 D 6 1.300000
#  9:    En 0.0  0 D 6 0.000000
# 10:    Fo 0.0  0 D 5 0.000000
# 11: Acute 0.0  0 E 6 0.000000
# 12:    An 7.9 60 E 6 1.316667
# 13:    Fo 0.0  0 E 5 0.000000
# 14:    Fo 7.9  3 F 5 1.580000
#[1] other data                
# 1: Acute 0.0   0 A 6 0.000000
# 2:    An 9.0 120 A 6 1.500000
# 3:    Fo 9.2   2 A 5 1.840000
# 4: Acute 8.3   1 B 6 1.383333
# 5:    An 7.7  26 B 6 1.283333
# 6:    Fo 0.0   0 B 5 0.000000
# 7: Acute 7.5   1 C 6 1.250000
# 8:    An 7.9  43 C 6 1.316667
# 9:    En 0.0   0 C 6 0.000000
#10:    Fo 5.4   1 C 5 1.080000
#11: Acute 8.6   2 D 6 1.433333
#12:    An 7.8  77 D 6 1.300000
#13:    En 0.0   0 D 6 0.000000
#14:    Fo 0.0   0 D 5 0.000000
#15: Acute 0.0   0 E 6 0.000000
#16:    An 7.9  60 E 6 1.316667
#17:    Fo 0.0   0 E 5 0.000000
#18: Acute 8.3   4 F 6 1.383333
#19:    An 8.2 326 F 6 1.366667
#20:    Fo 7.9   3 F 5 1.580000

UPDATE2

基于OP的评论

nm1 <- c("Acute", "An", "En")
v1 <- do.call(c, lapply(nm1, function(x) 
    capture.output(unname(DF[order(time)][time < 15 & Field == x, .(Field)]))))
v1 <- format(trimws(v1), width = max(nchar(v1)+max(nchar(nm1))), justify = "right")
i1 <- trimws(v1)=="" 
v1[i1] <- format(sprintf("[%d] %s", seq_along(i1[i1]), nm1),
          width = max(nchar(v1)), justify = "left")
cat(v1, sep="\n")