按组识别值变化(分类)。 R
Identify value change (categorical) by group. R
您可以在下面看到我的数据集示例。
Fac Date Type Change StartDT EndDT
AAA 1/1/2019 General 0 1/1/2019 1/2/2019
AAA 1/2/2019 General 0 1/1/2019 1/2/2019
AAA 1/3/2019 Special 1 1/3/2019 1/4/2019
AAA 1/4/2019 Special 1 1/3/2019 1/4/2019
AAA 1/5/2019 Intensive 2 1/5/2019 1/5/2019
BBB 1/1/2019 General 0 1/1/2019 1/4/2019
BBB 1/2/2019 General 0 1/1/2019 1/4/2019
BBB 1/3/2019 General 0 1/1/2019 1/4/2019
BBB 1/4/2019 General 0 1/1/2019 1/4/2019
BBB 1/5/2019 Reserve 1 1/5/2019 1/6/2019
BBB 1/6/2019 Reserve 1 1/5/2019 1/6/2019
我想创建一个变量来跟踪我的类型变量的变化(变化)。我曾经在 Stata 工作,这样做的逻辑是首先跟踪每个 panel/group 的值与先前记录 (0/1) 相比是否发生变化,然后对该值求和 运行 .
bysort Facility (Date): gen byte era = sum(Type != Type[_n-1] & _n > 1)
我如何在 R 中执行此操作?此外,在创建更改变量后,我将需要为每个 Fac 和更改 ("era") 生成开始和结束(最小、最大)日期。
如有任何帮助,我将不胜感激!提前致谢!
马文
这是一个解决方案,使用 dplyr:
dat =
tibble(
fac = c(rep("A", 10), rep("B", 10)),
type = sample(1:3, 20, replace = TRUE)
)
dat %>%
group_by(fac) %>%
mutate(
change = case_when(
type != lag(type) ~ TRUE,
TRUE ~ FALSE
),
n_change = cumsum(change)
)
对于您的代码,您可以添加:
group_by(Fac, n_change) %>%
mutate(
min_start_date = min(StartDT),
max_start_date = max(EndDT)
)
考虑使用 sapply
遍历行号序列以检查当前行和上一行的 Type 值。并使用 ave
对 Fac 组的总计进行内联聚合:
dat <- within(dat, {
# CONVERT DATES
Date <- with(dat, as.Date(Date, format="%m/%d/%Y"))
StartDT <- with(dat, as.Date(StartDT, format="%m/%d/%Y"))
EndDT <- with(dat, as.Date(StartDT, format="%m/%d/%Y"))
# CALCULATE TYPE CHANGES
type_delta <- c(NA, sapply(2:nrow(dat), function(i)
ifelse(dat$Type[i] != dat$Type[i-1], 1, 0)
)
)
era <- ave(type_delta, Fac, FUN=function(x) sum(x, na.rm=TRUE))
})
dat
# Fac Date Type Change StartDT EndDT era type_delta
# 1 AAA 2019-01-01 General 0 2019-01-01 2019-01-01 2 NA
# 2 AAA 2019-01-02 General 0 2019-01-01 2019-01-01 2 0
# 3 AAA 2019-01-03 Special 1 2019-01-03 2019-01-03 2 1
# 4 AAA 2019-01-04 Special 1 2019-01-03 2019-01-03 2 0
# 5 AAA 2019-01-05 Intensive 2 2019-01-05 2019-01-05 2 1
# 6 BBB 2019-01-01 General 0 2019-01-01 2019-01-01 2 1
# 7 BBB 2019-01-02 General 0 2019-01-01 2019-01-01 2 0
# 8 BBB 2019-01-03 General 0 2019-01-01 2019-01-01 2 0
# 9 BBB 2019-01-04 General 0 2019-01-01 2019-01-01 2 0
# 10 BBB 2019-01-05 Reserve 1 2019-01-05 2019-01-05 2 1
# 11 BBB 2019-01-06 Reserve 1 2019-01-05 2019-01-05 2 0
非常感谢@Parfait 和@user2363777 的所有帮助!这真太了不起了。我使用 user2363777 解决方案,因为我对 dplyr 更熟悉。对于最后一段代码,我只是在末尾包含了 ungroup() 函数。然后我只为每个设施和时代保留一个记录。
Fac Era Type StartDT EndDT
AAA 0 General 1/1/2019 1/2/2019
AAA 1 Special 1/3/2019 1/4/2019
AAA 2 Intensive 1/5/2019 1/5/2019
BBB 0 General 1/1/2019 1/4/2019
BBB 1 Reserve 1/5/2019 1/6/2019
我的最终目标是生成一个图表来描述设施类型随时间的变化(分类变量随时间的变化)。我将研究如何将其绘制成图表。我可能 post 很快就会有这方面的事情。谢谢!!
您可以在下面看到我的数据集示例。
Fac Date Type Change StartDT EndDT
AAA 1/1/2019 General 0 1/1/2019 1/2/2019
AAA 1/2/2019 General 0 1/1/2019 1/2/2019
AAA 1/3/2019 Special 1 1/3/2019 1/4/2019
AAA 1/4/2019 Special 1 1/3/2019 1/4/2019
AAA 1/5/2019 Intensive 2 1/5/2019 1/5/2019
BBB 1/1/2019 General 0 1/1/2019 1/4/2019
BBB 1/2/2019 General 0 1/1/2019 1/4/2019
BBB 1/3/2019 General 0 1/1/2019 1/4/2019
BBB 1/4/2019 General 0 1/1/2019 1/4/2019
BBB 1/5/2019 Reserve 1 1/5/2019 1/6/2019
BBB 1/6/2019 Reserve 1 1/5/2019 1/6/2019
我想创建一个变量来跟踪我的类型变量的变化(变化)。我曾经在 Stata 工作,这样做的逻辑是首先跟踪每个 panel/group 的值与先前记录 (0/1) 相比是否发生变化,然后对该值求和 运行 .
bysort Facility (Date): gen byte era = sum(Type != Type[_n-1] & _n > 1)
我如何在 R 中执行此操作?此外,在创建更改变量后,我将需要为每个 Fac 和更改 ("era") 生成开始和结束(最小、最大)日期。
如有任何帮助,我将不胜感激!提前致谢! 马文
这是一个解决方案,使用 dplyr:
dat =
tibble(
fac = c(rep("A", 10), rep("B", 10)),
type = sample(1:3, 20, replace = TRUE)
)
dat %>%
group_by(fac) %>%
mutate(
change = case_when(
type != lag(type) ~ TRUE,
TRUE ~ FALSE
),
n_change = cumsum(change)
)
对于您的代码,您可以添加:
group_by(Fac, n_change) %>%
mutate(
min_start_date = min(StartDT),
max_start_date = max(EndDT)
)
考虑使用 sapply
遍历行号序列以检查当前行和上一行的 Type 值。并使用 ave
对 Fac 组的总计进行内联聚合:
dat <- within(dat, {
# CONVERT DATES
Date <- with(dat, as.Date(Date, format="%m/%d/%Y"))
StartDT <- with(dat, as.Date(StartDT, format="%m/%d/%Y"))
EndDT <- with(dat, as.Date(StartDT, format="%m/%d/%Y"))
# CALCULATE TYPE CHANGES
type_delta <- c(NA, sapply(2:nrow(dat), function(i)
ifelse(dat$Type[i] != dat$Type[i-1], 1, 0)
)
)
era <- ave(type_delta, Fac, FUN=function(x) sum(x, na.rm=TRUE))
})
dat
# Fac Date Type Change StartDT EndDT era type_delta
# 1 AAA 2019-01-01 General 0 2019-01-01 2019-01-01 2 NA
# 2 AAA 2019-01-02 General 0 2019-01-01 2019-01-01 2 0
# 3 AAA 2019-01-03 Special 1 2019-01-03 2019-01-03 2 1
# 4 AAA 2019-01-04 Special 1 2019-01-03 2019-01-03 2 0
# 5 AAA 2019-01-05 Intensive 2 2019-01-05 2019-01-05 2 1
# 6 BBB 2019-01-01 General 0 2019-01-01 2019-01-01 2 1
# 7 BBB 2019-01-02 General 0 2019-01-01 2019-01-01 2 0
# 8 BBB 2019-01-03 General 0 2019-01-01 2019-01-01 2 0
# 9 BBB 2019-01-04 General 0 2019-01-01 2019-01-01 2 0
# 10 BBB 2019-01-05 Reserve 1 2019-01-05 2019-01-05 2 1
# 11 BBB 2019-01-06 Reserve 1 2019-01-05 2019-01-05 2 0
非常感谢@Parfait 和@user2363777 的所有帮助!这真太了不起了。我使用 user2363777 解决方案,因为我对 dplyr 更熟悉。对于最后一段代码,我只是在末尾包含了 ungroup() 函数。然后我只为每个设施和时代保留一个记录。
Fac Era Type StartDT EndDT
AAA 0 General 1/1/2019 1/2/2019
AAA 1 Special 1/3/2019 1/4/2019
AAA 2 Intensive 1/5/2019 1/5/2019
BBB 0 General 1/1/2019 1/4/2019
BBB 1 Reserve 1/5/2019 1/6/2019
我的最终目标是生成一个图表来描述设施类型随时间的变化(分类变量随时间的变化)。我将研究如何将其绘制成图表。我可能 post 很快就会有这方面的事情。谢谢!!