按组识别价值变化(分类)。R
下面您可以看到我的数据集示例按组识别价值变化(分类)。R,r,group-by,dplyr,lag,R,Group By,Dplyr,Lag,下面您可以看到我的数据集示例 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 Specia
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
我想创建一个变量来跟踪类型变量(change)中的更改。我曾经在Stata中工作,这样做的逻辑是首先跟踪每个面板/组的值是否与以前的记录(0/1)相比发生了变化,然后得到该值的运行总和
bysort Facility (Date): gen byte era = sum(Type != Type[_n-1] & _n > 1)
我在R怎么做?此外,在创建变更变量后,我需要为每个Fac和变更(“era”)生成开始和结束(最小、最大)日期
我将感谢任何帮助!提前谢谢!
Marvin这里有一个解决方案,使用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
遍历行号序列,以检查当前行和前一行的类型值。并使用ave
对Fac组的总计进行内联聚合:
dat非常感谢@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
我的最终目标是生成一个图表,描述设施类型随时间的变化(分类变量随时间的变化)。我将研究如何绘制此图。我可能很快会发布一些关于这个的东西。谢谢 请解释为什么这里的更改=22019年1月5日AAA强化版2 2019年1月5日2019年1月5日
,因为它从特殊版变为强化版。该变量中的任何更改都应该被跟踪。所以,如果设施AAA类型再次发生变化,我们需要记录它,它将是3。
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