gpt4 book ai didi

r - 如何在 R str() 中扩展 Posixct 字段?

转载 作者:行者123 更新时间:2023-12-04 01:14:06 25 4
gpt4 key购买 nike

我正在尝试扩展一个自定义 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)

R 3.3.3 中的输出
 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" ...

R 3.4.0 中的输出

同上,重现同样的问题。
  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) 中显示每个变量的项目数量?等等而没有在变量中扩展参数本身。

  • 消除病因学中的终端宽度和列因素

    我做了
  • 增加默认值:宽度从 80 增加到 150,列从 24 增加到 38
  • 重启终端提示
  • 运行 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

    最佳答案

    提案宽度

    为了实现“更宽”的输出,您可以更改默认值 width在 R options .

    根据 options {base}帮助:

    width:

    controls the maximum number of columns on a line used in printing vectors, matrices and arrays, and when filling by 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 中的参数.正如罗兰建议的那样。但同样,您必须为输出提供足够大的值(value)。 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 多个元素。

    关于r - 如何在 R str() 中扩展 Posixct 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44026585/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com