【问题标题】:How do I format row.names of an R table?如何格式化 R 表的 row.names?
【发布时间】:2014-03-28 17:05:53
【问题描述】:

考虑一下x 日期集:

set.seed(1234)
x <- sample(1980:2010, 100, replace = T)
x <- strptime(x, '%Y')
x <- strftime(x, '%Y')

以下是这些日期的年份分布:

> table(x)
x
1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1994 
   4    4    3    3    6    4    3    4    5   12    1    1    1    2 
1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 
   9    4    2    1    4    4    2    1    4    1    4    3    4    3 
2010 
   1 

现在假设我想按十年对它们进行分组。为此,我使用cut 函数:

> table(cut(x, seq(1980, 2010, 10)))
Error in cut.default(x, seq(1980, 2010, 10)) : 'x' must be numeric

好的,让我们将x 强制转换为数字:

> table(cut(as.numeric(x), seq(1980, 2010, 10)))

(1.98e+03,1.99e+03]    (1.99e+03,2e+03]    (2e+03,2.01e+03] 
                 45                  28                  23 

现在,如您所见,该表的row.names 采用科学格式。 如何强制它们不使用科学记数法?我尝试将上面的整个命令包装在 formatformatCprettyNum 中,但所有这些都是格式化频率。

【问题讨论】:

  • cut 有一个名为 dig.lab 的参数。
  • 你确定你在这里使用了set.seed()吗?我没有得到和你一样的结果。
  • 你可以做floor(x/10)*10
  • @AnandaMahto,你说得对,我在这里写的,忘记在我的 R 会话中使用它。 :$ 更新中。

标签: r format posixct scientific-notation


【解决方案1】:

感谢 joran 指出答案的路径。我在这里详细说明一下:

cutdig.lab 参数从默认的 3 更改为 4 解决了这个特定的模型以及我的真正问题:

> table(cut(as.numeric(x), seq(1980, 2010, 10), dig.lab = 4))

(1980,1990] (1990,2000] (2000,2010] 
         45          28          23 

顺便说一句,为了计算 1980 年,应该包含 include.lowest 参数:

> table(cut(as.numeric(x), seq(1980, 2010, 10), dig.lab = 4, include.lowest = T))

[1980,1990] (1990,2000] (2000,2010] 
         49          28          23 

现在总和为 100! :)

【讨论】:

  • 请注意,这会给您错误的值。首先,使用1980 作为下限不起作用,因为值1980 不会包含在cut 的任何组中,因为它是专有;它给你NA。其次,正式的十年将从 19801989 两者都包括在内,这不是你在这里得到的。
  • 我刚刚也注意到了,朱利安;使用include.lowest = T 解决了这个问题。你说得对,十年划分是对的,我现在并不担心。
  • 考虑只使用floor(as.numeric(x)/10)*10as.numeric(x)-as.numeric(x)%%10
【解决方案2】:

这并不能完全回答您提出的问题,而是向您展示了一个可能的替代方案:使用存在cut.Date 方法的事实:

set.seed(1234)
x <- sample(1980:2010, 100, replace = T)
x <- strptime(x, '%Y')
out <- table(cut(x, "10 years"))
out
# 
# 1980-01-01 1990-01-01 2000-01-01 2010-01-01 
#         48         25         26          1 

在这里,我们还得到了我认为每个 bin 的“正确”值。


作为我关于“正确”值的陈述的粗略证明,考虑一下我们根据table手动计算得到的值:

y <- strftime(x, '%Y')
Tab <- table(y)
Tab
# y
# 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1994 1995 1996 
#    4    4    3    3    6    4    3    4    5   12    1    1    1    2    9    4 
# 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2010 
#    2    1    4    4    2    1    4    1    4    3    4    3    1 
sum(Tab[grepl("198", names(Tab))])
# [1] 48
sum(Tab[grepl("199", names(Tab))])
# [1] 25
sum(Tab[grepl("200", names(Tab))])
# [1] 26
sum(Tab[grepl("201", names(Tab))])
# [1] 1

【讨论】:

  • 很好,感谢您提出这个问题!使用strptime 确实将03-28(今天的3 月28 日)添加到给定的年份,而不是我认为应该的01-01。您的更优雅的解决方案可能会在我的未来派上用场,但是将 x 强制转换为数字会产生更易于解释的行名(至少恕我直言)。
  • @WaldirLeoncio,没问题。希望它会派上用场。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多