2017-04-10 51 views
0

我是R新手如果条件未满足,我有一个简单的删除问题。在列上应用筛选器以删除行

我有一个CSV文件,一列是IP地址,问题不是所有的IP地址都想删除非IP地址的行。

样品表My.Data

ID.   SIP   DIP 
1.  123.243.0.1  56 
2.  123.143.0.1  89 
3.  0.16783633  44 
4.  123.143.0.1  89 

所以要删除的任何东西My.Data$SIP没有[O-9]{3}\.[O-9]{3}\.[O-9]{3}\.

我很失落,我使用dplyr

谢谢

保罗

回答

0

使用filtergrepl。我在这里假设IP地址的模式是“数字加点3次,然后是数字”。

library(dplyr) 
My.Data %>%> 
    filter(grepl("^(\\d+\\.){3}\\d+$", SIP)) 
+1

您的正则表达式并不完全正确,因为您需要将数字限制为1到3位数,因此您的正则表达式不会过滤掉“1234.5.6.7”。我相信''^(\\ d {1,3} \\。){3} \\ d + $“'会起作用。 – steveb

+0

当然,编辑适当的正则表达式:) – neilfws

0

看起来你已经熟悉正则表达式,所以你可以这样做:

hits = grepl(pattern = "[0-9]{3}\\.[0-9]{3}\\.[0-9]{3}", x = My.Data$SIP) 
My.Data2 <- My.Data[hits,] 

基本上这只是让无论您的数据帧匹配该列的逻辑矢量正则表达式。然后,我们根据该向量对数据进行子集分类。

+0

你好,我跑了你提供的,并得到了以下[1]否错误否,这是正确的方向丢失我正在使用的R Studio版本1.0.136 - ©2009- 2016 RStudio,Inc.,感谢您的帮助。 –

+0

'My.Data = data.frame(SIP = c(“023.152.342”,“not close”,“21.425.321”))grepl(pattern =“[0-9] {3} \\。[0 -9] {3} \\。[0-9] {3}“,x = My.Data $ SIP)'?我在猜测你并没有把它作为x或者其他小东西的正确载体。 – svenhalvorson