我正在尝试扩展一个自定义Posixct字段中显示的因子数量,其中正常方式(str(DF, list.len=ncol(DF), vec.len=20)
)不起作用。
我在这里要求20,但无论列表的长度如何,它都会一直显示两个("2017-01-01 08:40:00" "2017-01-01 08:50:00" ...
)
(这里3
)。
数据data.csv
"AAA", "BBB"
1, 01012017-0940+0100
2, 01012017-0950+0100
3, 01012017-0838+0100
代码
library('methods') # setClass
# https://unix.stackexchange.com/a/363290/16920
setClass('iso8601')
# https://stackoverflow.com/questions/5788117/only-read-limited-number-of-columns
setAs("character","iso8601",function(from) strptime(from,format="%d%m%Y-%H%M%z"))
DF <- read.csv(file='data.csv',
sep=',',
header=TRUE,
colClasses=c('numeric','iso8601'),
strip.white=TRUE)
DF
str(DF, list.len=ncol(DF), vec.len=20)
AAA BBB
1 1 2017-01-01 08:40:00
2 2 2017-01-01 08:50:00
3 3 2017-01-01 07:38:00
'data.frame': 3 obs. of 2 variables:
$ AAA : num 1 2 3
$ BBB : POSIXlt, format: "2017-01-01 08:40:00" "2017-01-01 08:50:00" ...
同上,重现同样的问题。
AAA BBB
1 1 2017-01-01 08:40:00
2 2 2017-01-01 08:50:00
3 3 2017-01-01 07:38:00
'data.frame': 3 obs. of 2 variables:
$ AAA: num 1 2 3
$ BBB: POSIXlt, format: "2017-01-01 08:40:00" "2017-01-01 08:50:00" ...
如何将str(DF, list.len=ncol(DF), vec.len=20)
扩展为每个变量的多个因子?
如何在str(DF)
中显示每个变量的项目数量?等等,在变量中没有参数本身的扩展。
我做了
Rscript myScript.r
代码不适用于所有场合,但数量有限,因此应该可以动态应用
# Roland's comment
str(DF, list.len=ncol(DF), vec.len=20, width = 100)
R:3.3.3,3.4.0(2017-04-21,backports)
操作系统:Debian 8.7
窗口管理器:Gnome 3.14.1
答案 0 :(得分:1)
为了实现“更广泛”的输出,您可以更改R width
中的默认options
。
根据options {base}
帮助:
宽度:
控制打印向量,矩阵和数组中使用的行上的最大列数,以及用cat填充时的最大列数。
Here is an example:
# initial try
str(DF, list.len=ncol(DF), vec.len=20)
它给出了:
'data.frame': 3 obs. of 2 variables:
$ AAA: num 1 2 3
$ BBB: POSIXlt, format: "2017-01-01 11:40:00" "2017-01-01 11:50:00" ...
现在,使用不同的width
:
# retain default options
op <- options()
# set apropriate width
n_cols <- 22 * 20 # n columns for 20 POSIXlt strings
n_cols <- n_cols + 50 # 50 columns for column description
# actually you can use any sufficiently big number
# for example n_cols = 1000
options(width = n_cols)
str(DF, list.len=ncol(DF), vec.len=20)
options(op)
结果是:
'data.frame': 3 obs. of 2 variables:
$ AAA: num 1 2 3
$ BBB: POSIXlt, format: "2017-01-01 11:40:00" "2017-01-01 11:50:00" "2017-01-01 10:38:00"
似乎您可以使用width
中的str
参数来实现此目的。就像罗兰建议的那样。但同样,你必须为输出提供足够大的价值。 1 POSIXlt字符串包含21个字符+空格。因此,对于20个字符串,您需要超过440列。
我已经尝试过你的例子:
DF <- rbind(DF, DF, DF) # nrows = 24
# Calculate string width
string_size <- nchar(as.character(DF[1, 2])) + 3 # string width + "" and \w
N <- 20 # number of items
n_cols <- string_size * N
str(DF, list.len=ncol(DF), vec.len=20, width = n_cols)
输出:
'data.frame': 24 obs. of 2 variables:
$ AAA: num 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3
$ BBB: POSIXlt, format: "2017-01-01 11:40:00" "2017-01-01 11:50:00" "2017-01-01 10:38:00" "2017-01-01 11:40:00" "2017-01-01 11:50:00" "2017-01-01 10:38:00" "2017-01-01 11:40:00" "2017-01-01 11:50:00" "2017-01-01 10:38:00" "2017-01-01 11:40:00" "2017-01-01 11:50:00" "2017-01-01 10:38:00" "2017-01-01 11:40:00" "2017-01-01 11:50:00" "2017-01-01 10:38:00" "2017-01-01 11:40:00" "2017-01-01 11:50:00" "2017-01-01 10:38:00" "2017-01-01 11:40:00" "2017-01-01 11:50:00" ...
正好有20个POSIXlt字符串。
输出问题源于为utils:::str.POSIXt
方法调用POSIXlt对象。有趣的部分是下一行:
larg[["vec.len"]] <- min(larg[["vec.len"]], (larg[["width"]] -
nchar(larg[["indent.str"]]) - 31)%/%19)
此行计算输出中POSIXlt字符串的数量。粗略地说输出将包含不超过vec.len
个POSIXlt字符串,并且字符输出的长度不会超过width
。
此处,larg
是传递给str
的参数列表。默认情况下,它们是:
vec.len = 4
;
width = 80
;
indent.str = " "
。
因此,重新计算的vec.len
默认为2。
至于最后一个示例,我们设置了vec.len = 20
,width = 440
,我们的数据框有24行。重新计算的vec.length
是20.因此输出str(DF)
包含20个POSIXlt字符串,并带有'...',这意味着POSIXlt向量中有超过20个元素。