所以我在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)
输出的数字来自哪里?
谢谢!
答案 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.abb
和month.name
都是R中的内置向量。您的向量包含缩写和完整拼写的混合,需要像我一样修剪或grep
- 作为@ musically_ut确实如此。他使用grep
在其中一个向量中找到位置,并创建了一个向量,其级别按日历月的自然顺序,然后我转换为数字。
还有非常有用的'zoo'包,它有'yearmon'类。这是以月份为单位存储数字的年份,因此您可以进行算术运算或排序。这个问题可以通过减去当前年份来利用它。
答案 1 :(得分:4)
查看输出,我怀疑class
的{{1}}为wr2000meter$Month
,其中factor
为levels
。将这些强制转换为数字时,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