【发布时间】:2020-05-21 13:14:14
【问题描述】:
我的数据由各州的观察结果组成(即各州的快餐公司)。同一年对同一州组的多次观察是常见的。每行包含一个值(即新快餐连锁店的数量)。我将这些数据汇总到州组年中,然后需要创建一个二分指标,用于判断每个州组对是否在每年达到一定的特许经营门槛。之后,我需要将数据聚合到州-年级别,并创建一个二分指标来衡量是否有任何个州-组对在该年通过了阈值。
我正在使用 dplyr 来执行此操作,并且下面的代码可以完美运行。但是,我正在对不同的阈值(25 个特许经营权、50 个特许经营权等)进行硬编码,并且想要一个解决方案,我可以为任意数量的阈值创建变量——例如 25:1000 之间的所有数字。有没有一种直接且程序化的方式来做到这一点?我已经尝试过 dplyr 链中的循环,但在如何添加具有原则名称的新变量时遇到了困难(名称应包含阈值,以便在以后的代码中轻松引用)。感谢您的帮助!
注意:请随意编辑标题/问题以使其更清晰。
x <- data.frame("state" = c(rep("mi",12),
rep("tx",12)),
"group" = c(rep("grp1",6),rep("grp2",6),
rep("grp3",6),rep("grp4",6)),
"year" = c(rep(1990,3),rep(1991,3),rep(1992,3),rep(1993,3),
rep(1990,3),rep(1991,3),rep(1992,3),rep(1993,3)),
"value" = c(seq(20,1200, by = 100),
seq(20,2400, by = 200)))
x_agg <- x %>%
group_by(state, group, year) %>%
summarise(value_tot = sum(value)) %>%
mutate(val20 = ifelse(value_tot >= 20, yes = 1, no = 0),
val50 = ifelse(value_tot >= 50, yes = 1, no = 0),
val100 = ifelse(value_tot >= 100, yes = 1, no = 0),
val250 = ifelse(value_tot >= 250, yes = 1, no = 0),
val500 = ifelse(value_tot >= 500, yes = 1, no = 0),
val750 = ifelse(value_tot >= 750, yes = 1, no = 0),
val1000 = ifelse(value_tot >= 1000, yes = 1, no = 0)) %>%
ungroup() %>%
group_by(state, year) %>%
summarise(val20 = as.numeric(any(val20 == 1)),
val50 = as.numeric(any(val50 == 1)),
val100 = as.numeric(any(val100 == 1)),
val250 = as.numeric(any(val250 == 1)),
val500 = as.numeric(any(val500 == 1)),
val750 = as.numeric(any(val750 == 1)),
val1000 = as.numeric(any(val1000 == 1)),) %>%
ungroup()
【问题讨论】:
标签: r dplyr data-cleaning