为R中的二进制响应按组创建排名变量

时间:2017-07-19 19:36:32

标签: r

我有一个数据集,其中包含年,月和日变量以及热波的二分变量(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)

4 个答案:

答案 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已按年正确排序,您可以使用avecumsum,如下所示:

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替换0dd$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