我有一个数据集,其中包含年,月和日变量以及热波的二分变量(Yes = 1,NO = 0)。我试图将热浪从最早的日期排列到最新的日期。如果热波变量= 0,那么我想将秩变量设为= 0
这就是我的数据,我想创建排名变量:
dd <- read.table(text="Year Month Day HW Rank
1999 5 2 0 0
1999 6 1 1 1
1999 6 5 1 2
2000 9 14 1 1
2000 9 15 0 0
2000 10 1 1 2
2001 7 3 0 0
2001 7 24 1 1
2001 8 12 1 2
2001 8 13 1 3", header=T)
答案 0 :(得分:1)
使用dplyr
即可
dd %>% group_by(Year) %>% arrange(Year, Month, Day) %>%
mutate(Rank2=ifelse(HW!=0, cumsum(HW), 0))
基本上我们只是&#34;加起来&#34;每年给定的HW标志数量。
答案 1 :(得分:1)
在基础R中,假设data.frame已按年正确排序,您可以使用ave
和cumsum
,如下所示:
df$Rank2 <- with(dd, ave(HW, Year, FUN=function(x) cumsum(x) * x))
此处,ave
按年度对数据进行分组,并对每个HW组执行函数cumsum(x) * x
。通过乘以X,无论cumsum
的当前值如何,我们都将HW的值设置为0到0。 with
用于减少输入。
答案 2 :(得分:1)
在第一部分中,我们计算lmo's solution中的分组cumsum
。然后,我们使用replace
替换0
为dd$HW
0
replace(x = ave(dd$HW, dd$Year, FUN = cumsum), list = dd$HW == 0, values = 0)
# [1] 0 1 2 1 0 2 0 1 2 3
答案 3 :(得分:0)
以下是使用data.table
library(data.table)
setDT(dd)[, Rank2 := cumsum(HW)*HW, Year]
dd$Rank2
#[1] 0 1 2 1 0 2 0 1 2 3