首页 > 解决方案 > 根据两个条件创建新列的最佳方法是什么?

问题描述

我有 60 年的每日天气数据,并且想标记每个冬天(即 1-60)。因为冬天是跨年的,所以没有办法ifelse仅使用月份来划分或编写简单的语句。ifelse为 60 年中的每一年指定月份和年份的嵌套语句似乎不切实际,有没有更好的方法来做到这一点?

这里只是一个三年的例子。

month<-c(11,12,1,2,3,4,11,12,1,2,3,4,11,12,1,2,3,4)
year<-c(1950,1950,1951,1951,1951,1951,1951,1951,1952,1952,1952,1952,1952,1952,1953,1953,1953,1953)
df<-cbind(month,year)
df<-as.data.frame(df)

我希望 1950 年 11 月到 1951 年 4 月之间的日期在新列中都标记为 1。1951 年 11 月至 1952 年 4 月之间的日期标记为 2,以此类推。

我希望最终的数据框看起来像这样:

    month year winter
1     11 1950      1
2     12 1950      1
3      1 1951      1
4      2 1951      1
5      3 1951      1
6      4 1951      1
7     11 1951      2
8     12 1951      2
9      1 1952      2
10     2 1952      2
11     3 1952      2
12     4 1952      2
13    11 1952      3
14    12 1952      3
15     1 1953      3
16     2 1953      3
17     3 1953      3
18     4 1953      3

由于我拥有 30 多个气象站的 60 年每日数据,因此有什么简单的方法可以做到这一点吗?

标签: r

解决方案


像这样使用cumsum

transform(df, winter = cumsum(month == 11))

给予:

   month year winter
1     11 1950      1
2     12 1950      1
3      1 1951      1
4      2 1951      1
5      3 1951      1
6      4 1951      1
7     11 1951      2
8     12 1951      2
9      1 1952      2
10     2 1952      2
11     3 1952      2
12     4 1952      2
13    11 1952      3
14    12 1952      3
15     1 1953      3
16     2 1953      3
17     3 1953      3
18     4 1953      3

推荐阅读