1

所以我在 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

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

谢谢!

4

2 回答 2

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 那样 -ing。他过去常常grep在其中一个向量中找到位置,我创建了一个向量,其级别按日历月的自然顺序排列,然后我将其转换为数字。

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

于 2013-09-29T19:10:25.307 回答
4

查看输出,我怀疑classofwr2000meter$Month带有factor一些levels. 当将这些强制转换为数字时,R 根本不查看 的字符串表示level,而是查看level. 有关详细信息,请参阅R Inferno的第 8.2.1 节。

在这种情况下,R 方便地为我们提供了月份的名称以及缩写作为内置常量。但是,由于您的数据包含一些缩写和一些全名,因此我们需要在这里获得一些创意并使用它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
于 2013-09-29T19:00:35.853 回答