如何根据面板数据集中的某个值统计行数?

How to count number of rows based on a certain value in a panel data set?

我正在处理像 df 这样的面板数据。所以我有一个唯一的 UserID (Uid)、一个 TimeVariable (TV) 和我感兴趣的主要变量(MV,虚拟编码)。 每行代表一个独特的 UiD 电视组合。 现在我想创建一个新变量 (NV),它基本上计算时间 TV 发生的事件数 (MV=1)。

内容:我想要一个计数变量 (NV),它基本上计算每个时刻事件 MV=1 在那个时刻 (TV) 发生的频率。

到目前为止,我只能设法对每个 UserId 进行总结,但不能在递增的水平上进行总结。

到目前为止我管理的内容:

df <- df %>% group_by(user_id) %>% mutate(NV=count_if(1,MV))

结果是根据 MV 的每个用户 ID 汇总提供给我的

所以 df 看起来像:

UI TV MV
1  1  0
1  2  1
1  3  0
2  1  0
2  2  0
2  3  1
2  4  2
3  1  1
3  2  0
3  3  1
3  4  1

到目前为止我的代码的结果是:

UI TV MV NV
1  1  0  1
1  2  1  1
1  3  0  1
2  1  0  2
2  2  0  2
2  3  1  2
2  4  2  2
3  1  1  3
3  2  0  3
3  3  1  3
3  4  1  3

我真正想要的是:

UI TV MV NV
1  1  0  0
1  2  1  1
1  3  0  1
2  1  0  0
2  2  0  0
2  3  1  1
2  4  2  2
3  1  1  1
3  2  0  1
3  3  1  2
3  4  1  3

非常感谢您的帮助!

我们可以 group_by UI 并计算 MV == 1

出现的累积总和
library(dplyr)

df %>%
  group_by(UI) %>%
  mutate(NV = cumsum(MV == 1))


#      UI    TV    MV    NV
#   <int> <int> <int> <int>
# 1     1     1     0     0
# 2     1     2     1     1
# 3     1     3     0     1
# 4     2     1     0     0
# 5     2     2     0     0
# 6     2     3     1     1
# 7     2     4     2     1
# 8     3     1     1     1
# 9     3     2     0     1
#10     3     3     1     2
#11     3     4     1     3

在基础 R 中,我们可以使用 ave

with(df, ave(MV == 1, UI, FUN = cumsum))
#[1] 0 1 1 0 0 1 1 1 1 2 3

数据

df <- structure(list(UI = c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 
3L), TV = c(1L, 2L, 3L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), MV = c(0L, 
1L, 0L, 0L, 0L, 1L, 2L, 1L, 0L, 1L, 1L)), class = "data.frame", 
row.names = c(NA, 
-11L))