如何根据面板数据集中的某个值统计行数?
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))
我正在处理像 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))