我想在R data.table
中更一致地显示数据的后续打印。
例如,在Vim中,您可以使用tapstop
和csv.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")
答案 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
基于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")