2017-08-25 119 views
0

我有一个大的数据框(df),看起来像下面的示例。数据集中有许多数据输入错误,我需要删除这些错误。在样本数据中的所有新南威尔士州国家应该有一个邮政编码开头2.所有VIC国家应该有一个邮编开始3根据多个条件从DF中删除数据

| Suburb | State | Postcode | 
| ------ | ----- | -------- | 
| FLEMINGTON | NSW | 2140 | 
| FLEMINGTON | NSW | 2144 | 
| FLEMINGTON | NSW | 3996 | 
| FLEMINGTON | VIC | 2996 | 
| FLEMINGTON | VIC | 3021 | 
| FLEMINGTON | VIC | 3031 | 

我需要的决赛桌的样子......

| Suburb | State | Postcode | 
| ------ | ----- | -------- | 
| FLEMINGTON | NSW | 2140 | 
| FLEMINGTON | NSW | 2144 | 
| FLEMINGTON | VIC | 3021 | 
| FLEMINGTON | VIC | 3031 | 

下面的解决方案是有点紧密,但我不知道如何过滤整数,从一个特定的数字开始,并在时间压力下。

Extracting rows from df based on multiple conditions in R

任何帮助将不胜感激。

回答

3

为了使这很容易扩展上,做得一样只针对你的每个状态可接受值的合并操作:

merge(
    transform(dat, Pc1=substr(Postcode,1,1)), 
    data.frame(State=c("NSW","VIC"),Pc1=c("2","3")) 
) 

# State Pc1  Suburb Postcode 
#1 NSW 2 FLEMINGTON  2140 
#2 NSW 2 FLEMINGTON  2144 
#3 VIC 3 FLEMINGTON  3021 
#4 VIC 3 FLEMINGTON  3031 
+0

像梦一样工作。 :) –

+0

或者通过计算频率setDT(df)[,N:= .N,。(substr(Postcode,1,1),State)] [,.SD [N == max(N)] ,状态] [,N:= NULL] []' – akrun

0

试试这个吗?如果你的邮编是整数&只有这些条件,它应该是非常简单的:

df <- data.frame(Suburb = rep("FLEMINGTON", 6), 
       State = c(rep("NSW", 3), rep("VIC", 3)), 
       Postcode = c(2140,2144,3996,2996,3021,3031)) 

library(dplyr) 

df <- df %>% 
    filter((State == "NSW" & Postcode < 3000) | (State == "VIC" & Postcode >= 3000)) 

> df 
     Suburb State Postcode 
1 FLEMINGTON NSW  2140 
2 FLEMINGTON NSW  2144 
3 FLEMINGTON VIC  3021 
4 FLEMINGTON VIC  3031 
+0

感谢您的评论。除了示例中的组合之外,还有很多组合,因此接受的解决方案在此情况下效果最佳。 :) –