如何将R中的Months矢量更改为R中的数值

时间:2013-09-29 18:50:02

标签: r vector

所以我在R中的数据框中有一个名为Month的向量。我的数据框叫做wr200meter。以下是wr200meter$Month的输出:

[1] May    June   June   Nov    Oct    March  April 

[8] May    July   July   Sept   June   March  April 

[15] June   Oct    August June   Oct    Sept   June  

[22] August August August

当我as.numeric(wr200meter$Month)时,我得到:

[1] 6 4 4 7 8 5 1 6 3 3 9 4 5 1 4 8 2 4 8 9 4 2 2 2

我想得的是十进制数。例如,对于六月我想要0.5而对于九月,我想要0.75。有人可以告诉我: 1)如何获得我想要的十进制数 2)as.numeric(wr200meter$Month)输出的数字来自哪里?

谢谢!

2 个答案:

答案 0 :(得分:5)

 monfac <- factor(substr(mons,1,3), levels=month.abb)
 as.numeric(monfac)/12
 [1] 0.4166667 0.5000000 0.5000000 0.9166667 0.8333333 0.2500000 0.3333333
 [8] 0.4166667 0.5833333 0.5833333 0.7500000 0.5000000 0.2500000 0.3333333
[15] 0.5000000 0.8333333 0.6666667 0.5000000 0.8333333 0.7500000 0.5000000
[22] 0.6666667 0.6666667 0.6666667

month.abbmonth.name都是R中的内置向量。您的向量包含缩写和完整拼写的混合,需要像我一样修剪或grep - 作为@ musically_ut确实如此。他使用grep在其中一个向量中找到位置,并创建了一个向量,其级别按日历月的自然顺序,然后我转换为数字。

还有非常有用的'zoo'包,它有'yearmon'类。这是以月份为单位存储数字的年份,因此您可以进行算术运算或排序。这个问题可以通过减去当前年份来利用它。

答案 1 :(得分:4)

查看输出,我怀疑class的{​​{1}}为wr2000meter$Month,其中factorlevels。将这些强制转换为数字时,R根本不会查看level的字符串表示,而是查看level的索引。有关详细信息,请参阅R Inferno的第8.2.1节。

在这种情况下,R方便地将月份名称和缩写提供给我们built-in constants。但是,由于您的数据包含一些缩写和一些全名,因此我们需要在此处获得一些创意,并使用grep来匹配部分名称:

d <- factor(c("May", "June", "June", "Nov", "Oct", "March", "April", "May", "July", "July", "Sept", "June", "March", "April", "June", "Oct", "August", "June", "Oct", "Sept", "June", "August", "August", "August"))
sapply(d, function (x) { grep(x, month.name); }) / 12 
 [1] 0.4166667 0.5000000 0.5000000 0.9166667 0.8333333 0.2500000 0.3333333
 [8] 0.4166667 0.5833333 0.5833333 0.7500000 0.5000000 0.2500000 0.3333333
[15] 0.5000000 0.8333333 0.6666667 0.5000000 0.8333333 0.7500000 0.5000000
[22] 0.6666667 0.6666667 0.6666667

因此,这应该产生您正在寻找的输出:

sapply(wr200meter$Month, function (x) { grep(x, month.name); }) / 12