《数据驱动的网络分析》——6.4 数据帧

6.4 数据帧

数据帧(Data Frame)是R的一种独特结构,从分析人员的角度说,它也是最重要的结构。数据帧是一个临时数据表,在这种表格结构中,每列代表一个变量。在其他语言中,数据帧通过使用数组或者散列表部分实现,但是R将数据帧作为一种基本结构,从一开始就提供了更为复杂的数据帧选择、过滤和操纵机制。

我们从创建一个简单的数据帧开始(如例6-1所示)。构造数据帧的最简单方法是在一组相同大小的矢量上使用data.frame操作。

例6-1 创建一个数据帧

> names<-c('Manny','Moe','Jack')
> ages<-c(25,35,90)
> states<-c('NJ','NE','NJ')
> summary.data <- data.frame(names, ages, states)
> summary.data
 names ages states
1 Manny  25   NJ
2  Moe  35   NE
3 Jack  90   NJ
> summary.data$names
[1] Manny Moe Jack
Levels: Jack Manny Moe

在此,data.frame将每个数组放入一列中,组成一个3列3行的表格。我们可以提取一列,注意,在使用summary.data$names引用的矢量名称时,使用了术语“Levels(级别)”。

因子

在创建表的过程中,R将数据中的字符串转换为因子(Factor),因子是类别的矢量,可以从字符串或者整数中创建,例如:

services<-c("http","bittorrent","smtp","http","http","bittorrent")
service.factors<-factor(services)
service.factors
[1] http    bittorrent smtp    http    http   bittorrent
Levels: bittorrent http smtp
services
[1] "http"  "bittorrent" "smtp"    "http"  "http"   "bittorrent"

因子的级别(Level)描述了不同的类别。

在许多函数中,R的默认行为是将字符串转换为因子。在read.table和 data.frame函数中都是如此,也可以通过stringsAsFactors参数和stringsAsFactors选项控制。
访问数据帧的命令是read.table,该命令有各种用于读取不同数据类型的参数。在例6-2中,传递了不同的选项,让其读取输入文件sample.txt中的rwcut输出。

例6-2 向read.table传递选项

$ cat sample.txt | cut -d '|' -f 1-4
    sIP|    dIP|sPort|dPort|
 10.0.0.1| 10.0.0.2|56968| 80|
 10.0.0.1| 10.0.0.2|56969| 80|
 10.0.0.3|...
$ R --silent
> s<-read.table(file='sample.txt',header=T,sep='|',strip.white=T)
> s
    sIP      dIP sPort dPort pro packets bytes flags
1 10.0.0.1   10.0.0.2 56968   80  6    4  172 FS A
2 10.0.0.1   10.0.0.2 56969   80  6    5  402 FS PA
3 10.0.0.3 65.164.242.247 56690  80  6    5 1247 FS PA
4 10.0.0.4 99.248.195.24 62904 19380  6    1  407 F PA
5 10.0.0.3 216.73.87.152 56691  80  6    7  868 FS PA
6 10.0.0.3 216.73.87.152 56692  80  6    5  760 FS PA
7 10.0.0.5 138.87.124.42 2871  2304  6    7  603 F PA
8 10.0.0.3 216.73.87.152 56694  80  6    5  750 FS PA
9 10.0.0.1 72.32.153.176 56970  80  6    6  918 FS PA
          sTime dur          eTime sen X
1 2008/03/31T18:01:03.030  0 2008/03/31T18:01:03.030  0 NA
2 2008/03/31T18:01:03.040  0 2008/03/31T18:01:03.040  0 NA
3 2008/03/31T18:01:03.120  0 2008/03/31T18:01:03.120  0 NA
4 2008/03/31T18:01:03.160  0 2008/03/31T18:01:03.160  0 NA
5 2008/03/31T18:01:03.220  0 2008/03/31T18:01:03.220  0 NA
6 2008/03/31T18:01:03.220  0 2008/03/31T18:01:03.220  0 NA
7 2008/03/31T18:01:03.380  0 2008/03/31T18:01:03.380  0 NA
8 2008/03/31T18:01:03.430  0 2008/03/31T18:01:03.430  0 NA
9 2008/03/31T18:01:03.500  0 2008/03/31T18:01:03.500  0 NA

注意使用的参数。file参数不言自明。header参数指示R将文件的第一行作为结果数据帧的列名。Sep定义列分隔符,在本例中SiLK命令使用默认的/。strip.white命令指示R删除文件中的过多空格。结果是,每个值都被读入并自动转换为列格式。

有了数据,就可以过滤和操纵了,如例6-3所示。

例6-3 操纵和过滤数据

> #我可以从记录中创建布尔矢量,对其进行过滤,例如:
> s$dPort == 80
[1] TRUE TRUE TRUE FALSE TRUE TRUE FALSE TRUE TRUE
> #然后,我可以使用该值滤除s$dPort == 80的行。注意其中的逗号,如果没有使用它,
> #我选择的就是列而不是行。
> s[s$dPort==80,]
    sIP       dIP sPort dPort pro packets bytes flags
1 10.0.0.1    10.0.0.2 56968  80  6    4  172 FS A
2 10.0.0.1    10.0.0.2 56969  80  6    5  402 FS PA
3 10.0.0.3 65.164.242.247 56690   80  6    5  1247 FS PA
5 10.0.0.3 216.73.87.152 56691   80  6    7  868 FS PA
6 10.0.0.3 216.73.87.152 56692   80  6    5  760 FS PA
8 10.0.0.3 216.73.87.152 56694   80  6    5  750 FS PA
9 10.0.0.1 72.32.153.176 56970   80  6    6  918 FS PA
          sTime dur           eTime sen  X
1 2008/03/31T18:01:03.030  0 2008/03/31T18:01:03.030  0  NA
2 2008/03/31T18:01:03.040  0 2008/03/31T18:01:03.040  0  NA
3 2008/03/31T18:01:03.120  0 2008/03/31T18:01:03.120  0  NA
5 2008/03/31T18:01:03.220  0 2008/03/31T18:01:03.220  0  NA
6 2008/03/31T18:01:03.220  0 2008/03/31T18:01:03.220  0  NA
8 2008/03/31T18:01:03.430  0 2008/03/31T18:01:03.430  0  NA
9 2008/03/31T18:01:03.500  0 2008/03/31T18:01:03.500  0  NA
> #我也可以合并规则,使用|表示“或”,&表示“与”
> s[s$dPort==80 & s$sIP=='10.0.0.3',]
    sIP        dIP sPort dPort pro packets bytes flags
3 10.0.0.3 65.164.242.247 56690    80  6    5 1247 FS PA
5 10.0.0.3 216.73.87.152 56691    80  6    7  868 FS PA
6 10.0.0.3 216.73.87.152 56692    80  6    5  760 FS PA
8 10.0.0.3 216.73.87.152 56694    80  6    5  750 FS PA
          sTime dur            eTime sen X
3 2008/03/31T18:01:03.120  0 2008/03/31T18:01:03.120  0 NA
5 2008/03/31T18:01:03.220  0 2008/03/31T18:01:03.220  0 NA
6 2008/03/31T18:01:03.220  0 2008/03/31T18:01:03.220  0 NA
8 2008/03/31T18:01:03.430  0 2008/03/31T18:01:03.430  0 NA
> #我可以使用名称访问列
> s[s$dPort==80 & s$sIP=='10.0.0.3',][c('sIP','dIP','sTime')]
    sIP      dIP          sTime
3 10.0.0.3 65.164.242.247 2008/03/31T18:01:03.120
5 10.0.0.3 216.73.87.152 2008/03/31T18:01:03.220
6 10.0.0.3 216.73.87.152 2008/03/31T18:01:03.220
8 10.0.0.3 216.73.87.152 2008/03/31T18:01:03.430
> #我还可以访问单个行
> s[1,]
    sIP    dIP sPort dPort pro packets bytes flags           sTime
1 10.0.0.1 10.0.0.2 56968   80  6    4  172 FS A 2008/03/31T18:01:03.030
 dur            eTime sen X
1  0 2008/03/31T18:01:03.030  0 NA

R的数据帧提供了一个高效的临时单表数据库。除了前面的例子中所说明的行添加和选择之外,我们还可以用$运算符添加新列。

> #创建载荷字节数的新矢量
> payload_bytes <- s$bytes - (40 * s$packets)
> s$payload_bytes <- payload_bytes
> s[0:2,][c('sIP','dIP','bytes','packets','payload_bytes')]
    sIP    dIP bytes packets payload_bytes
1 10.0.0.1 10.0.0.2  172    4      12
时间: 2024-10-23 12:33:43

《数据驱动的网络分析》——6.4 数据帧的相关文章

《数据驱动的网络分析》——第6章 R安全分析简介

第6章 R安全分析简介 R是一个开源统计分析软件包,最初由奥克兰大学的Ross Ihaka和Robert Gentleman开发.R的设计者主要是统计学家和数据分析人员,与商业统计软件包(如S和SPSS)关联.R是用于探索性数据分析的工具包,它提供了统计建模和数据操纵能力.可视化和一个全功能的编程语言. R可以满足多种分析需求.分析工作需要某些工具来创建和操纵汇总原始数据的小型临时数据库.例如,从特定主机采集.按照服务分解的每小时流量汇总.这些数据表比原始数据更复杂,但是其目的不是为了最后发布-

《数据驱动的网络分析》——6.2 R语言基础知识

6.2 R语言基础知识 本节是R语言的速成教程.R是一种特性丰富的语言,我也只是略懂一二.但是,在本节结束时,你就能够编写简单的R程序,在命令行上运行,并将其保存为一个库. 6.2.1 R提示符 启动R,将会显示一个窗口和命令提示符.图6-1展示了一个R控制台的例子.如图所示,控制台主要是一个大的文本窗口,顶部的一系列按钮提供了辅助功能.注意按钮栏下的两个文本框,第一个显示当前工作目录,第二个是帮助功能.R有很好的文档,所以一定要习惯使用帮助框. 在图6-1中,我输入了几条简单的命令: > s<

《数据驱动的网络分析》——第2章 网络传感器2.1 网络分层及其对测量的影响

第2章 网络传感器 网络传感器直接从网络通信中采集数据,不需要中介应用程序作为代理,这使其不同于第3章中讨论的基于主机传感器.这方面的例子包括路由器上的NetFlow传感器,以及使用tcpdump等嗅探工具采集流量的传感器. 网络流量所面临的挑战是你在所有日志数据中都会遇到的:真正的安全事件很少,而数据在时间和存储空间上都有代价.只要可能,首选日志数据,因为它清晰(日志数据记录了高级事件)而紧凑.网络流量中的相同事件必需从几百万个数据包中提取,这些数据包往往是冗余.加密或者难以理解的.与此同时,

《数据驱动的网络分析》——导读

内容提要传统的入侵检测和日志文件分析已经不再足以保护当今的复杂网络,本书讲解了多种网络流量数据集的采集和分析技术及工具,借助这些工具,可以迅速定位网络中的问题,并采取相应的行动,保障网络的运行安全. 本书分为3部分,共15章,内容包括数据采集的常规过程,用于采集网络流量的传感器,基于特定系统的传感器,数据存储和分析,使用互联网层次知识系统(SiLK)分析NetFlow数据,用于安全分析的R语言简介.入侵检测系统的工作机制以及实施,确定实施攻击的幕后真凶,探索性数据分析以及数据可视化,检查通信流量

《数据驱动的网络分析》——2.3 NetFlow

2.3 NetFlow NetFlow是Cisco开发的流量汇总标准,最初用于网络服务记账.虽然本意不是为了安全性,但是人们臆测NetFlow对此有益,因为它提供了紧凑的网络通信会话摘要,可以快速访问,并且包含了以相对紧凑的格式保存的最高价值信息.从1999年flow-tools软件包发布以来,NetFlow越来越多地用于安全分析,已经开发出了各种工具,这些工具为NetFlow提供了更多的字段,例如可选择的载荷片段. NetFlow的核心是流(Flow)的概念,它与TCP会话近似.回忆前面介绍的

《数据驱动的网络分析》——6.3 使用R工作区

6.3 使用R工作区 R为用户提供了一个持久化的工作区,也就是说,当用户退出R会话,他们可以选择保存数据和变量供未来使用.这一操作基本上是透明完成的,如下面的命令行示例: > s<-1:15 > s [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 > t<-(s*3) - 5 > t [1] –2 1 4 7 10 13 16 19 22 25 28 31 34 37 40 > Save workspace image? [y/n/

《数据驱动的网络分析》——2.2 封包数据

2.2 封包数据 在本书的语境中,封包数据实际上意味着libpcap的输出,这种输出可能是通过IDS或者tcpdump完成.libpcap最初由LBNL的网络研究组开发,是基本的网络捕捉工具,可以作为snort.bro和tcpdump等工具的采集器. 在封包捕捉数据中寻找有价值的信息如同大海捞针.这类数据的捕捉需要平衡海量的可捕捉数据和真正有意义的少数数据之间的关系. 2.2.1 封包和帧格式在几乎所有现代化系统上,tcpdump将在以太网上捕捉IP,这意味着libpcap捕捉的数据实际上是包含

《数据驱动的网络分析》——6.5 可视化

6.5 可视化 R提供了现成的.极其强大的可视化能力,许多标准可视化可以用高级命令完成.在下面的例子中,我们将用一个正态分布样本制作直方图,并将结果显示在屏幕上. 第10章讨论各种可视化技术.在本节中,我们的重点是R可视化的各种功能,包括图像控制.保存和操纵. 6.5.1 可视化命令R有许多高级可视化命令,可以绘制时间序列.直方图和柱状图.套件中的骨干命令是plot,它可以用于提供来源于散点图的多种图形:简单散点图.阶梯图和序列图. 表6-1列出了主要的图形名称,help命令对这些图形提供了说明

《数据驱动的网络分析》——6.6 分析:统计假设检验

6.6 分析:统计假设检验 R设计用于为统计分析人员提供各种数据检查工具.本章迄今为止所讨论的编程功能都是达到该目的的手段.我们希望使用的R主要功能是通过识别统计显著特征,支持警报的构建(更多关于警报构建的讨论参见第7章). 识别对警报有用的属性,需要识别"重要"的行为,对"重要"有各种不同的定义.R提供了许多用于研究数据并对数据进行统计检验的工具套件.学习这些工具的使用,需要理解R工具提供的常见测试统计数字.本章余下的部分重点关注这些任务. 6.6.1 假设检验统