基于两个条件创建新列的最佳方法是什么?

时间:2019-08-28 20:14:45

标签: r

我有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年的每日数据?

1 个答案:

答案 0 :(得分:1)

像这样使用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