我想在下面的数据框中添加新列,以计算每个月的最大干拼长度。这是我的数据框的样子:
day month year rr spell spell1
1 1 1981 0 dry 1
2 1 1981 0 dry 1
3 1 1981 0 dry 1
4 1 1981 1.1 dry 0
5 1 1981 0 dry 1
6 1 1981 0 dry 1
7 1 1981 0 dry 1
8 1 1981 0 dry 1
9 1 1981 2.7 dry 0
10 1 1981 0 dry 1
Run Code Online (Sandbox Code Playgroud)
这是我需要的输出:
month year spell_length
1 1981 3
1 1981 4
1 1981 1
Run Code Online (Sandbox Code Playgroud)
到目前为止,这是我所做的:
group_by(df, year, month, spell1) %>%
summarise(spell2 = sum(spell1, na.rm = TRUE))
Run Code Online (Sandbox Code Playgroud)
结果是:
year month spell1 spell_length
<int> <int> <dbl> <dbl>
1 1981 1 1 31
2 1981 2 0 0
3 1981 2 1 27
4 1981 3 0 0
5 1981 3 1 25
6 1981 4 0 0
Run Code Online (Sandbox Code Playgroud)
数据
df <- read.table(h= T, text="day month year rr spell spell1
1 1 1981 0 dry 1
2 1 1981 0 dry 1
3 1 1981 0 dry 1
4 1 1981 1.1 dry 0
5 1 1981 0 dry 1
6 1 1981 0 dry 1
7 1 1981 0 dry 1
8 1 1981 0 dry 1
9 1 1981 2.7 dry 0
10 1 1981 0 dry 1")
Run Code Online (Sandbox Code Playgroud)
一种选择是按'spell'的'run-length-id' 分组(rleid从data.table-当该列中的值更改时创建新的分组ID),filter将'spell1'为0的行取出,得到行数与n()
library(dplyr)
library(data.table)
df1 %>%
group_by(year, month, grp = rleid(spell1)) %>%
filter(spell1 ==1) %>%
summarise(spell_length = n()) %>%
ungroup %>%
select(-grp)
# A tibble: 3 x 3
# year month spell_length
# <int> <int> <int>
#1 1981 1 3
#2 1981 1 4
#3 1981 1 1
Run Code Online (Sandbox Code Playgroud)
或者使用rle从base R
rl1 <- rle(df1$spell1)
rl1$lengths[rl1$values > 0]
#[1] 3 4 1
Run Code Online (Sandbox Code Playgroud)
注意:当'spell1'值不同时,此解决方案也适用
使用,dplyr我们可以在每次出现0时使用来创建组,cumsum并对spells每个组中的数量求和。
library(dplyr)
df %>%
group_by(month, year, group = cumsum(spell1 == 0)) %>%
summarise(spell_length = sum(spell1)) %>%
ungroup() %>%
select(-group)
# month year spell_length
# <int> <int> <int>
#1 1 1981 3
#2 1 1981 4
#3 1 1981 1
Run Code Online (Sandbox Code Playgroud)