R中数据表的多列选择与修改
我正在读取一些原始日志数据,并在解析之前对其进行预处理。我阅读了日志,然后添加了一列draw$rule,表示要应用的解析规则R中数据表的多列选择与修改,r,R,我正在读取一些原始日志数据,并在解析之前对其进行预处理。我阅读了日志,然后添加了一列draw$rule,表示要应用的解析规则 > raw<-readLines("20130205000046 firewall_log.txt") > draw<-as.data.frame(raw) > draw$rule <- 0 > head(draw)
> raw<-readLines("20130205000046 firewall_log.txt")
> draw<-as.data.frame(raw)
> draw$rule <- 0
> head(draw)
raw
1 2013 Feb 4 06:15:59 [UTM9S] [kernel] WAN2LAN[ACCEPT] IN=WAN OUT=LAN SRC=66.249.75.193 DST=192.168.1.38 PROTO=TCP SPT=42415 DPT=80
2 2013 Feb 4 06:16:22 [UTM9S] [kernel] WAN2LAN[ACCEPT] IN=WAN OUT=LAN SRC=66.249.75.193 DST=192.168.1.38 PROTO=TCP SPT=63520 DPT=80
3 2013 Feb 4 06:16:46 [UTM9S] [kernel] WAN2LAN[ACCEPT] IN=WAN OUT=LAN SRC=66.249.75.193 DST=192.168.1.38 PROTO=TCP SPT=55379 DPT=80
4 2013 Feb 4 06:17:10 [UTM9S] [kernel] WAN2LAN[ACCEPT] IN=WAN OUT=LAN SRC=66.249.75.193 DST=192.168.1.38 PROTO=TCP SPT=49425 DPT=80
5 2013 Feb 4 06:17:34 [UTM9S] [kernel] WAN2LAN[ACCEPT] IN=WAN OUT=LAN SRC=66.249.75.193 DST=192.168.1.38 PROTO=TCP SPT=34270 DPT=80
6 2013 Feb 4 06:17:39 [UTM9S] [kernel] WAN2LAN[ACCEPT] IN=WAN OUT=LAN SRC=66.249.75.193 DST=192.168.1.38 PROTO=TCP SPT=35331 DPT=80
rule
1 0
2 0
3 0
4 0
5 0
6 0
>原始绘图$规则头(绘图)
未经加工的
1 2013年2月4日06:15:59[UTM9S][kernel]WAN2LAN[ACCEPT]IN=WAN OUT=LAN SRC=66.249.75.193 DST=192.168.1.38协议=TCP SPT=42415 DPT=80
2 2013年2月4日06:16:22[UTM9S][kernel]WAN2LAN[ACCEPT]IN=WAN OUT=LAN SRC=66.249.75.193 DST=192.168.1.38 PROTO=TCP SPT=63520 DPT=80
3 2013年2月4日06:16:46[UTM9S][kernel]WAN2LAN[ACCEPT]IN=WAN OUT=LAN SRC=66.249.75.193 DST=192.168.1.38 PROTO=TCP SPT=55379 DPT=80
4 2013年2月4日06:17:10[UTM9S][kernel]WAN2LAN[ACCEPT]IN=WAN OUT=LAN SRC=66.249.75.193 DST=192.168.1.38 PROTO=TCP SPT=49425 DPT=80
5 2013年2月4日06:17:34[UTM9S][kernel]WAN2LAN[ACCEPT]IN=WAN OUT=LAN SRC=66.249.75.193 DST=192.168.1.38 PROTO=TCP SPT=34270 DPT=80
6 2013年2月4日06:17:39[UTM9S][kernel]WAN2LAN[ACCEPT]IN=WAN OUT=LAN SRC=66.249.75.193 DST=192.168.1.38 PROTO=TCP SPT=35331 DPT=80
规则
1 0
2 0
3 0
4 0
5 0
6 0
现在,我想根据原始日志数据中匹配的模式来标记行。下面的语句在某种程度上起作用,它使用1拾取行和标志draw$rule
> draw[grep("^.*ACCEPT.*PROTO=(TCP|UDP).*$",draw$raw),2] <- 1
> head(draw)
raw
1 2013 Feb 4 06:15:59 [UTM9S] [kernel] WAN2LAN[ACCEPT] IN=WAN OUT=LAN SRC=66.249.75.193 DST=192.168.1.38 PROTO=TCP SPT=42415 DPT=80
2 2013 Feb 4 06:16:22 [UTM9S] [kernel] WAN2LAN[ACCEPT] IN=WAN OUT=LAN SRC=66.249.75.193 DST=192.168.1.38 PROTO=TCP SPT=63520 DPT=80
3 2013 Feb 4 06:16:46 [UTM9S] [kernel] WAN2LAN[ACCEPT] IN=WAN OUT=LAN SRC=66.249.75.193 DST=192.168.1.38 PROTO=TCP SPT=55379 DPT=80
4 2013 Feb 4 06:17:10 [UTM9S] [kernel] WAN2LAN[ACCEPT] IN=WAN OUT=LAN SRC=66.249.75.193 DST=192.168.1.38 PROTO=TCP SPT=49425 DPT=80
5 2013 Feb 4 06:17:34 [UTM9S] [kernel] WAN2LAN[ACCEPT] IN=WAN OUT=LAN SRC=66.249.75.193 DST=192.168.1.38 PROTO=TCP SPT=34270 DPT=80
6 2013 Feb 4 06:17:39 [UTM9S] [kernel] WAN2LAN[ACCEPT] IN=WAN OUT=LAN SRC=66.249.75.193 DST=192.168.1.38 PROTO=TCP SPT=35331 DPT=80
rule
1 1
2 1
3 1
4 1
5 1
6 1
>draw[grep(“^.*ACCEPT.*PROTO=(TCP | UDP.*$”,draw$raw),2]头(draw)
未经加工的
1 2013年2月4日06:15:59[UTM9S][kernel]WAN2LAN[ACCEPT]IN=WAN OUT=LAN SRC=66.249.75.193 DST=192.168.1.38协议=TCP SPT=42415 DPT=80
2 2013年2月4日06:16:22[UTM9S][kernel]WAN2LAN[ACCEPT]IN=WAN OUT=LAN SRC=66.249.75.193 DST=192.168.1.38 PROTO=TCP SPT=63520 DPT=80
3 2013年2月4日06:16:46[UTM9S][kernel]WAN2LAN[ACCEPT]IN=WAN OUT=LAN SRC=66.249.75.193 DST=192.168.1.38 PROTO=TCP SPT=55379 DPT=80
4 2013年2月4日06:17:10[UTM9S][kernel]WAN2LAN[ACCEPT]IN=WAN OUT=LAN SRC=66.249.75.193 DST=192.168.1.38 PROTO=TCP SPT=49425 DPT=80
5 2013年2月4日06:17:34[UTM9S][kernel]WAN2LAN[ACCEPT]IN=WAN OUT=LAN SRC=66.249.75.193 DST=192.168.1.38 PROTO=TCP SPT=34270 DPT=80
6 2013年2月4日06:17:39[UTM9S][kernel]WAN2LAN[ACCEPT]IN=WAN OUT=LAN SRC=66.249.75.193 DST=192.168.1.38 PROTO=TCP SPT=35331 DPT=80
规则
1 1
2 1
3 1
4 1
5 1
6 1
我遇到的困难是扩展选择,以便只在与正则表达式匹配的行上工作,并将Dead $规则集设置为0,换言之,只考虑尚未匹配的行。我想就地更新draw$rule的值,而不是在此阶段提取子集
如何修改语句以实现这一点?最终结果是有一系列语句,如:draw[<some selection condition 1> && draw$rule==0,2] <-1
draw[<some selection condition 2> && draw$rule==0,2] <-2
draw[<some selection condition 3> && draw$rule==0,2] <-3
etc
draw[&&draw$rule==0,2]使用grepl
代替grep
。此函数返回与其参数长度相同的逻辑向量。另外,不要使用&
,而是使用&
<代码>&
用于单个元素,而&
用于向量。使用grepl
代替grep
。此函数返回与其参数长度相同的逻辑向量。另外,不要使用&
,而是使用&
<代码>&&用于单个元素,而&&
用于向量。