gpt4 book ai didi

r - 创建在面板数据组内的条件下重新启动的顺序计数器

转载 作者:行者123 更新时间:2023-12-04 16:27:10 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Numbering rows within groups in a data frame

(9 个回答)


5年前关闭。




我有一个面板数据集,我想为其创建一个计数器,该计数器随着面板中的每一步而增加,但在发生某些情况时重新启动。就我而言,我使用的是国家/地区年数据,并希望计算事件之间的年数。这是一个玩具数据集,其中包含我真实数据的主要特征:

df <- data.frame(country = rep(c("A","B"), each=5), year=rep(2000:2004, times=2), event=c(0,0,1,0,0,1,0,0,1,0), stringsAsFactors=FALSE)

我要做的是创建一个以 df$event 为键的计数器。在每个国家的一系列观察中。当我们开始观察每个国家时,时钟从 1 开始;每年增加1;并且每当 df$event==1 时它都会从 1 重新开始.所需的输出是这样的:
   country year event clock
1 A 2000 0 1
2 A 2001 0 2
3 A 2002 1 1
4 A 2003 0 2
5 A 2004 0 3
6 B 2000 1 1
7 B 2001 0 2
8 B 2002 0 3
9 B 2003 1 1
10 B 2004 0 2

我试过使用 getanID来自 splitstackshape以及 if 的一些变体和 ifelse但到目前为止未能获得预期的结果。

我已经在使用 dplyr在我需要执行此操作的脚本中,因此我更喜欢使用它或基于 R 的解决方案,但我将不胜感激。我的数据集并不庞大,所以速度并不重要,但效率总是加分项。

最佳答案

dplyr那将是:

df %>% 
group_by(country, idx = cumsum(event == 1L)) %>%
mutate(counter = row_number()) %>%
ungroup %>%
select(-idx)

#Source: local data frame [10 x 4]
#
# country year event counter
#1 A 2000 0 1
#2 A 2001 0 2
#3 A 2002 1 1
#4 A 2003 0 2
#5 A 2004 0 3
#6 B 2000 1 1
#7 B 2001 0 2
#8 B 2002 0 3
#9 B 2003 1 1
#10 B 2004 0 2

或使用 data.table :
library(data.table)
setDT(df)[, counter := seq_len(.N), by = list(country, cumsum(event == 1L))]

编辑: group_by(country, idx = cumsum(event == 1L))用于按国家和新的分组索引“idx”分组。 event == 1L part 创建一个逻辑索引,告诉我们“事件”列是否为整数 1 ( TRUE/ FALSE )。然后, cumsum(...)前 2 行从 0 开始求和,接下来的 3 行从 1 开始,接下来的 3 行从 2 开始,依此类推。我们使用这个新列(+国家/地区)根据需要对数据进行分组。如果您删除 dplyr 代码中的最后一个管道部件,您可以检查它。

关于r - 创建在面板数据组内的条件下重新启动的顺序计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32247414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com