按组为R中的二进制响应创建秩变量
我有一个数据集,包括年、月、日变量和热浪的二分变量(Yes=1,NO=0)。我正试图将热浪从最早的日期到最晚的日期,按年份进行排序。如果热浪变量=0,那么我想把变量排序为=0 这就是我的数据,我想创建rank变量:按组为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
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))
。