R中的时间序列图,处理缺失数据

R中的时间序列图,处理缺失数据,r,time-series,timeserieschart,R,Time Series,Timeserieschart,我正试图为我的数据绘制一个时间序列图——这是在探索(两个国家)随着时间的推移如何利用各种攻击(网络攻击与军事化的州际争端) 以下是我的数据的一部分: Dyadpair year cyberattack cyberseverity MID MIDhostility 200345 1992 NA NA 1 3.00 200345 1993 NA NA

我正试图为我的数据绘制一个时间序列图——这是在探索(两个国家)随着时间的推移如何利用各种攻击(网络攻击与军事化的州际争端)

以下是我的数据的一部分:

   Dyadpair   year   cyberattack  cyberseverity  MID   MIDhostility  
   200345     1992   NA           NA             1     3.00
   200345     1993   NA           NA             2     2.667
   200345     1998   NA           NA             12    2.667
   200345     1999   NA           NA             16    2.500
   20045      2000   NA           NA             0     1.00
   2365       2000   NA           NA             3     1.75
   2365       2008   6            3.833          NA    NA
   2356       2009   2            2.50           NA    NA
   2365       2014   7            3.14           NA    NA    
我想创建一个时间序列图,显示: 1) Dyadpair如何随着时间的推移而改变其使用网络攻击的方式,以及这些网络攻击的严重性如何随着时间的推移而变化 2) Dyadpair如何随着时间的推移而改变他们如何使用MID(军事化的州际争端),以及这些MID的敌意如何随着时间的推移而改变

问题是我有很多丢失的数据(NAs)。这是因为网络数据只在2000-2015年间运行,而我的另一个数据集在1992-2010年间运行

尽管存在数据缺失的问题,我应该如何创建上面描述的时间序列图


更新:我想出了如何使用dplyr的“过滤器”功能来选择一个二元:

library(dplyr)
USRUS <-total %>%
select (Dyadpair, year, cyberattack, cyberseverity, MID, midhostility) %>%
filter(Dyadpair == "2365")
但是,我如何着手创建一个阴谋,显示网络攻击(和严重性)和军事攻击(和严重性),随着时间的推移,这一特定的二元关系(2365:美国和俄罗斯)?因为到目前为止,我的情节只反映了美国和俄罗斯在网络空间的行为——它不包括任何关于中间或中间敌意/严重性的内容

您面临两个挑战:可视化和数据争用。丢失数据实际上并不是您的难题之一,您将在数据整理好后看到这一点。当你刚接触R时,制定一个攻击计划可能是它自己的挑战,但它应该从最终目标开始。在这种情况下,我建议绘制两幅图:

  • 一个显示随时间推移的攻击次数,以及
  • 另一个显示随着时间的推移攻击的严重性
数据争用

你应该从整理数据开始。这意味着每种类型的变量(例如年份、攻击的严重性等)都有一列(且只有一列),而每个观察值都有一行。现在,您的一些变量分布在多个列中。例如,除非我误解了你的数据,否则网络攻击和网络攻击的严重性实际上是指同一件事,一种对攻击严重性的度量

这将有助于考虑数据的结构。你确实观察到了5个变量

  • 达达派尔
  • 攻击类别(中型或网络型)
  • 类别中的攻击数
  • 攻击的严重性
下面的代码使用共享的数据创建一个数据框,整理它,然后打印它

library(dplyr)
library(tidyr)
library(ggplot2)

original.df <- tribble(
~Dyadpair, ~year, ~cyberattack, ~cyberseverity, ~MID, ~MIDhostility,
200345,     1992,   NA,           NA,             1,     3.00,
200345,     1993,   NA,           NA,             2,     2.667,
200345,     1998,   NA,           NA,             12,    2.667,
200345,     1999,   NA,           NA,             16,    2.500,
20045,      2000,   NA,           NA,             0,     1.00,
2365,       2000,   NA,           NA,             3,     1.75,
2365,       2008,   6,            3.833,          NA,    NA,
2356,       2009,   2,            2.50,           NA,    NA,
2365,       2014,   7,            3.14,           NA,    NA
)

# Split the data into separate data frames for military and cyber. Rename
# columns for severity and attack number for consistency with the other dataset

military.df <- select(original.df, Dyadpair, year, attack = MID, severity = MIDhostility) %>%
  filter(!is.na(attack)) %>% # remove rows with no data
  mutate(attack_type = "MID") # add column identifying attack type

cyber.df <- select(original.df, Dyadpair, year, attack = cyberattack, severity = cyberseverity) %>%
  filter(!is.na(attack)) %>%
  mutate(attack_type = "cyber")

# Now combine the two dataframes into one. We've already ensured
# that they have the same columns, so we'll just concatenate them.
# Since attack_type is a categorical variable, we should make it 
# a factor.

df <- bind_rows(military.df, cyber.df) %>%
  mutate(attack_type = factor(attack_type))

df

# A tibble: 9 x 5
# Dyadpair  year attack severity attack_type
# <dbl> <dbl>  <dbl>    <dbl> <fct>      
# 1   200345  1992      1     3    MID        
# 2   200345  1993      2     2.67 MID        
# 3   200345  1998     12     2.67 MID        
# 4   200345  1999     16     2.5  MID        
# 5    20045  2000      0     1    MID        
# 6     2365  2000      3     1.75 MID        
# 7     2365  2008      6     3.83 cyber      
# 8     2356  2009      2     2.5  cyber      
# 9     2365  2014      7     3.14 cyber      

您还询问了关于绘制单个Dyadpair的数据,并说您希望显示军事和网络类别的年份、攻击次数和攻击严重程度。只有这么多的美学,你可以映射数据,你开始用尽,但这里去

  • x轴年
  • y轴攻击次数
  • 攻击的严重性
因为你说网络和军事的时间尺度可能非常不同,我们可以创建共享y轴但在x轴范围内可以自由变化的并排图

usrus.df <- filter(df, Dyadpair == "2365")

ggplot(data = usrus.df, aes(x = year, y = attack, color = severity)) +
  geom_point() +
  geom_line() +
  facet_wrap(facets = vars(attack_type)) +
  ylab("attacks") +
  ggtitle("USRUS")

usrus.df您尝试了什么<代码>绘图
函数很好地忽略了NaN,所以您应该没有理由不能绘图。如果你展示你的尝试和错误,我们可能help@Chelmy88,
NaN
NA
不同。。。但是你的其余评论仍然适用。@r2evans的确……纽特,虽然的主题与数据丢失有关,但我觉得它不适用于这里,因此你要么只显示两个数据都有的年份,要么接受一个值将很好地开始绘图。您的数据是一个良好的开端,感谢您将其包括在内,如果我们在这个时间跨度内实际看到相同的
Dyadpair
(可能是2-3)数据,这可能会有所帮助。正如Chelmy88所建议的那样,它仍然可以很好地绘制,但这取决于您是如何做到这一点的。您能提供一些代码吗?非常感谢您的帮助和建议,特别是您关于从最终目标开始的提示。数据争论很有道理。我已经为我所有的数据做了这些,但现在我有三个后续问题。1.我将“严重性”合并到一个类别/情节中,即使这些攻击严重性的等级不一定相同,也可以吗?(他们来自两个不同的数据集。中度敌意的量表范围为1-5,网络敌意的量表范围为1-10)。将我的数据组织到一个包含“攻击类型”类别的框架中,现在意味着我有1016个观察值。(在我的数据争论之前,我只有992次观察)。因为网络数据非常小,所以在2000-2010年间,它并没有真正出现在我的GGP图上。我能做些什么吗。这些情节也没有给我任何关于二人组的信息。我假设我不可能把所有的底片都放在一块地上,因为有这么多底片。如果为了避免这个问题,我选择了一些具体的动态,给我的读者一个“案例研究”的例子,说明随着时间的推移,这可能会是什么样子呢?我是否可以选择一个二元(例如200645——代表英国和伊拉克)并为该二元创建一个情节——让我的读者更多地了解二元在一段时间内使用了哪些攻击(网络攻击或MID攻击)?1)如果严重性等级不同,那么我不会将它们放在同一个情节中;2) 为军事和网络攻击创建单独的阴谋。绘图将根据数据进行缩放;3) 你得玩这个。您可以使用
dplyr::filter
获取特定动态的行。通过将颜色映射到Dyadpair,您可以尝试一次绘制许多颜色,以查看是否出现大规模趋势。下面是一个关于绘制的快速跟进。请看我更新的帖子。
ggplot(df, aes(x = year, y = attack, color = attack_type)) +
  geom_line()
ggplot(df, aes(x = year, y = severity, color = attack_type)) +
  geom_line()
usrus.df <- filter(df, Dyadpair == "2365")

ggplot(data = usrus.df, aes(x = year, y = attack, color = severity)) +
  geom_point() +
  geom_line() +
  facet_wrap(facets = vars(attack_type)) +
  ylab("attacks") +
  ggtitle("USRUS")