我想在下面的数据框中添加新列,以计算每个月的最大干拼长度。
这是我的数据框的样子:
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
这是我需要的输出:
month year spell_length
1 1981 3
1 1981 4
1 1981 1
到目前为止,这是我所做的:
group_by(df, year, month, spell1) %>%
summarise(spell2 = sum(spell1, na.rm = TRUE))
结果如下:
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
数据
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")
最佳答案
一种选择是按'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
或使用
rle
中的base R
rl1 <- rle(df1$spell1)
rl1$lengths[rl1$values > 0]
#[1] 3 4 1
注意:当'spell1'值不同时,此解决方案也适用
关于r - 汇总按组返回长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56073291/