根据标准(R)生成滚动理货 问题描述
我正在处理美国冲突事件的电子表格。每行代表一个事件,并包含地理和时间信息。冲突事件往往以“波”(相对紧密的时间分组)的形式发生。我已经为每一次浪潮生成了一个身份变量,并希望创建一个变量来衡量这些冲突事件在每一次浪潮过程中的地理分布 很遗憾,我没有动态数组公式。在升级到新版本的Excel之前,我想看看是否可以在R中使用。数据已经按区域、日期和波形排序 数据描述 数据集的结构如下所示:根据标准(R)生成滚动理货 问题描述,r,criteria,rolling-computation,R,Criteria,Rolling Computation,我正在处理美国冲突事件的电子表格。每行代表一个事件,并包含地理和时间信息。冲突事件往往以“波”(相对紧密的时间分组)的形式发生。我已经为每一次浪潮生成了一个身份变量,并希望创建一个变量来衡量这些冲突事件在每一次浪潮过程中的地理分布 很遗憾,我没有动态数组公式。在升级到新版本的Excel之前,我想看看是否可以在R中使用。数据已经按区域、日期和波形排序 数据描述 数据集的结构如下所示: Country Region Date Event Wave -------
Country Region Date Event Wave
------- ------- ------ ------- ------
USA Vermont 5/1/2017 Strike Wave 1
USA Vermont 5/2/2017 Strike Wave 1
USA New Hamp. 5/3/2017 Strike Wave 1
USA Vermont 5/3/2017 Strike Wave 1
USA Maine 5/4/2017 Strike Wave 1
USA Washingt. 8/16/2018 Riot Wave 2
USA Washingt. 8/18/2018 Riot Wave 2
USA Oregon 8/18/2018 Protest Wave 2
USA Californ. 8/19/2018 Riot Wave 2
USA Nevada 8/20/2018 Protest Wave 2
USA Idaho 8/20/2018 Riot Wave 2
我想创造什么
我想创建一个变量(“geo_disp”),记录在给定的波中经历冲突的区域的数量。在整个wave中,我预计区域的数量会增加,我希望geo_disp变量能够记录这一点
您会注意到,当两个事件发生在同一天但发生在不同的位置时,这两个事件都会记录在区域总数中
以下是我希望数据的外观:
Country Region Date Event Wave geo_disp
------- ------- ------ ------- ------ --------
USA Vermont 5/1/2017 Strike Wave 1 1
USA Vermont 5/2/2017 Strike Wave 1 1
USA New Hamp. 5/3/2017 Strike Wave 1 2
USA Vermont 5/3/2017 Strike Wave 1 2
USA Maine 5/4/2017 Strike Wave 1 3
USA Washingt. 8/16/2018 Riot Wave 2 1
USA Washingt. 8/18/2018 Riot Wave 2 2
USA Oregon 8/18/2018 Protest Wave 2 2
USA Californ. 8/19/2018 Riot Wave 2 3
USA Nevada 8/20/2018 Protest Wave 2 5
USA Idaho 8/20/2018 Riot Wave 2 5
如何使用R创建geo_disp变量
提前感谢您-我非常感谢。如果您不介意在同一波形中删除重复区域,您可以使用tidyverse尝试这种方法:
library(tidyverse)
df <- tribble(
~Country, ~Region, ~Date, ~Event, ~Wave,
'USA', 'Vermont', '5/1/2017', 'Strike', 'Wave 1',
'USA', 'Vermont', '5/2/2017', 'Strike', 'Wave 1',
'USA', 'New Hamp.', '5/3/2017', 'Strike', 'Wave 1',
'USA', 'Vermont', '5/3/2017', 'Strike', 'Wave 1',
'USA', 'Maine', '5/4/2017', 'Strike', 'Wave 1',
'USA', 'Washingt.', '8/16/2018', 'Riot', 'Wave 2',
'USA', 'Washingt.', '8/18/2018', 'Riot', 'Wave 2',
'USA', 'Oregon', '8/18/2018', 'Protest', 'Wave 2',
'USA', 'Californ.', '8/19/2018', 'Riot', 'Wave 2',
'USA', 'Nevada', '8/20/2018', 'Protest', 'Wave 2',
'USA', 'Idaho', '8/20/2018', 'Riot', 'Wave 2'
)
df %>% distinct(Region, .keep_all = T) %>% group_by(Wave) %>% mutate(geo_disp = 1:n())
保留整个数据集的dplyr解决方案
library(dplyr)
df %>% group_by(Wave) %>% mutate(disp_geo = cumsum(!duplicated(Region)))
#> # A tibble: 11 x 6
#> # Groups: Wave [2]
#> Country Region Date Event Wave disp_geo
#> <chr> <chr> <chr> <chr> <chr> <int>
#> 1 USA Vermont 5/1/2017 Strike Wave 1 1
#> 2 USA Vermont 5/2/2017 Strike Wave 1 1
#> 3 USA New Hamp. 5/3/2017 Strike Wave 1 2
#> 4 USA Vermont 5/3/2017 Strike Wave 1 2
#> 5 USA Maine 5/4/2017 Strike Wave 1 3
#> 6 USA Washingt. 8/16/2018 Riot Wave 2 1
#> 7 USA Washingt. 8/18/2018 Riot Wave 2 1
#> 8 USA Oregon 8/18/2018 Protest Wave 2 2
#> 9 USA Californ. 8/19/2018 Riot Wave 2 3
#> 10 USA Nevada 8/20/2018 Protest Wave 2 4
#> 11 USA Idaho 8/20/2018 Riot Wave 2 5
库(dplyr)
df%%>%分组依据(波形)%%>%变异(disp\U geo=cumsum(!重复(区域)))
#>#A tibble:11 x 6
#>#组别:波浪[2]
#>国家/地区日期事件波形显示
#>
#>1美国佛蒙特州2017年5月1日罢工浪潮1
#>2美国佛蒙特州2017年5月2日罢工浪潮1
#>3美国新罕布什尔州。2017年5月3日罢工浪潮1 2
#>4美国佛蒙特州2017年5月3日罢工浪潮1 2
#>5美国缅因州5/4/2017罢工浪潮1 3
#>6美国华盛顿。2018年8月16日暴动浪潮2 1
#>7美国华盛顿。2018年8月18日暴动浪潮2 1
#>8美国俄勒冈州2018年8月18日抗议浪潮2
#>9美国加利福尼亚州。2018年8月19日暴动浪潮2 3
#>10美国内华达州2018年8月20日抗议浪潮2 4
#>11美国爱达荷州2018年8月20日暴动浪潮2 5
我们可以在按“Wave”分组后使用匹配
library(data.table)
setDT(df)[, geo_disp := match(Region, unique(Region)), Wave]
或使用
dplyr
library(dplyr)
df %>%
group_by(Wave) %>%
mutate(geo_disp = match(Region, unique(Region))
前面的答案解决了这个问题,但要添加累积计数(我认为Yasha正试图实现这一点),您需要:
library(data.table)
set.seed(1)
toy_data = data.table(
region = sample(LETTERS[1:3], 10, replace = T),
wave = c(rep(1,5),rep(2,5))
)
toy_data[,count:=cummax(match(region, unique(region))), wave]
# > toy_data
# region wave count
# 1: A 1 1
# 2: C 1 2
# 3: A 1 2
# 4: B 1 3
# 5: A 1 3
# 6: C 2 1
# 7: C 2 1
# 8: B 2 2
# 9: B 2 2
# 10: C 2 2
levels的使用非常聪明,它看起来像这个代码创建的geo_disp变量不会随着时间的推移而累积。有没有办法让它跟踪任何特定观察中发生冲突事件的区域总数?谢谢大家!@雅莎,看看我的最新消息-你是这个意思吗?@Allan Cameron-天哪,我想你解决了这个问题。非常感谢你!你好@akrun-非常感谢。当我运行您提供的代码时,geo_disp变量似乎不会累积。我希望这个变量能够跟踪波浪过程中发生事件的区域数量。@Yasha也许,这是一个不同的例子。对不起,没有理由道歉!我真的很感谢你的帮助。谢谢你的帮助。我希望不要从数据集中删除观察结果。我真的很感谢dput()的帮助-我下次会用到它。谢谢你的帮助。当我运行你的代码时,我得到了这样一条错误消息:“错误在
:=
(计数,cummax(匹配(区域,唯一(区域)))):检查是否为.data.table(DT)==TRUE。否则,:=和:=
(…)被定义为只在j中使用一次,并且以特定的方式使用。请参阅帮助(“:=”)。抱歉@Yasha,我没有将库(data.table)
放在顶部。现在应该行了。是的,现在行了!哇,太谢谢你了!
library(data.table)
set.seed(1)
toy_data = data.table(
region = sample(LETTERS[1:3], 10, replace = T),
wave = c(rep(1,5),rep(2,5))
)
toy_data[,count:=cummax(match(region, unique(region))), wave]
# > toy_data
# region wave count
# 1: A 1 1
# 2: C 1 2
# 3: A 1 2
# 4: B 1 3
# 5: A 1 3
# 6: C 2 1
# 7: C 2 1
# 8: B 2 2
# 9: B 2 2
# 10: C 2 2