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

按组为R中的二进制响应创建秩变量,r,R,我有一个数据集,包括年、月、日变量和热浪的二分变量(Yes=1,NO=0)。我正试图将热浪从最早的日期到最晚的日期,按年份进行排序。如果热浪变量=0,那么我想把变量排序为=0 这就是我的数据,我想创建rank变量: dd <- read.table(text="Year Month Day HW Rank 1999 5 2 0 0 1999 6 1 1 1 1999

我有一个数据集,包括年、月、日变量和热浪的二分变量(Yes=1,NO=0)。我正试图将热浪从最早的日期到最晚的日期,按年份进行排序。如果热浪变量=0,那么我想把变量排序为=0

这就是我的数据,我想创建rank变量:

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)

dd使用
dplyr
您可以

dd %>% group_by(Year) %>% arrange(Year, Month, Day) %>% 
  mutate(Rank2=ifelse(HW!=0, cumsum(HW), 0))

基本上,我们只是“相加”您在每个给定年份拥有的硬件标志的数量。

使用
dplyr
您可以这样做

dd %>% group_by(Year) %>% arrange(Year, Month, Day) %>% 
  mutate(Rank2=ifelse(HW!=0, cumsum(HW), 0))

基本上,我们只是“相加”每个给定年份的HW标志数。

在基数R中,假设data.frame已按年份正确排序,您可以使用
ave
cumsum
,如下所示:

df$Rank2 <- with(dd, ave(HW, Year, FUN=function(x) cumsum(x) * x))

df$Rank2在基数R中,假设data.frame已按年份正确排序,您可以像这样使用
ave
cumsum

df$Rank2 <- with(dd, ave(HW, Year, FUN=function(x) cumsum(x) * x))

df$Rank2在第一部分中,我们计算分组的
cumsum
如中所示。然后,我们使用
replace
dd$HW
0
的索引中替换
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

在第一部分中,我们计算分组的
cumsum
like In。然后,我们使用
replace
dd$HW
0
的索引中替换
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

这里有一个使用
数据的选项。表

library(data.table)
setDT(dd)[, Rank2 := cumsum(HW)*HW, Year]
dd$Rank2
#[1] 0 1 2 1 0 2 0 1 2 3

这里有一个使用
数据的选项。表

library(data.table)
setDT(dd)[, Rank2 := cumsum(HW)*HW, Year]
dd$Rank2
#[1] 0 1 2 1 0 2 0 1 2 3

我有
replace(ave(dd$HW,dd$Year,FUN=cumsum),dd$HW==0,0)
,我认为这本质上是相同的,使用
replace的索引参数是一种非常酷的方法。如果你想作为一个单独的答案发布,我会投票给你。我有
replace(ave(dd$HW,dd$Year,FUN=cumsum),dd$HW==0,0)
,我认为这基本上是一样的,这是使用
replace
的索引参数的一种非常酷的方式。如果你想作为一个单独的答案发布,我会投票。用
transform
多加一点NSE,你可以做
transform(dd,Rank3=replace(ave(HW,Year,FUN=cumsum),HW==0,0))
。用
transform
多加一点NSE,你可以做
transform(dd,Rank3=replace(ave(ave,Year,FUN=cumsum),HW==0,0))