2017-04-17 121 views
0

我想根据两个条件删除一些行。 这是我的代码根据r中的多个条件删除行

test <-datasetjoin[!(datasetjoin$Occupation == "Clerical" & datasetjoin$AvgMonthSpend > 58.515),]
test <- test[!(test$Occupation == "Management" & test$AvgMonthSpend > 59.24),] test <- test[!(test$Occupation == "Manual" & test$AvgMonthSpend > 54.28),] test <- test[!(test$Occupation == "Professional" & test$AvgMonthSpend > 60.08),]
test <- test[!(test$Occupation == "Skilled Manual" & test$AvgMonthSpend > 57.06),] test <- test[!(test$NumberCarsOwned == "1" & test$YearlyIncome > (81300-51140) * 1.5 + 81300),]
是否有可能以更优雅的方式获得相同的结果?

预先感谢

Occupation MonthlySpend 
Clerical 60   
Management 59   
Clerical 62   
Clerical 58   
Clerical 63    
Management 56 
Management 58  

如果职业=文书及MonthlySpend> 60然后丢弃这些行 如果职业=管理和MonthlySpend> 57然后丢弃这些行。 最后我应该得到这样的:

Occupation MonthlySpend 
Clerical 58 
Management 56 
+0

请为您的问题提供[可重现的例子](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)。 –

+0

@AdamQuek请检查帖子,我用一个例子编辑。有没有办法做到这一点与循环?或应用()? –

回答

2

使用或组合的所有条件:|

像:

test <- test[!(test$Occupation == "Management" & test$AvgMonthSpend > 59.24) | !(test$Occupation == "Manual" & test$AvgMonthSpend > 54.28),] 
1

,你可以尝试这样的事情。

步骤1.定义限制:

df <- read.table(text="Occupation MonthlySpend 
Clerical 60   
Management 59   
Clerical 62   
Clerical 58   
Clerical 63    
Management 56 
Management 58 ", stringsAsFactors=FALSE, header = TRUE) 


df2 <- read.table(text="Occupation lmt 
Clerical 60   
Management 57   
", stringsAsFactors=FALSE, header = TRUE) 

第二步。加入和过滤

df %>% left_join(df2, by = "Occupation") %>% 
    group_by(Occupation) %>% 
    filter(MonthlySpend < lmt) %>% 
    select(MonthlySpend) 

这给:

Source: local data frame [2 x 2] 
Groups: Occupation [2] 

    Occupation MonthlySpend 
     <chr>  <int> 
1 Clerical   58 
2 Management   56 

这样一来,你要花费一些资源在确定第二数据帧,但过滤的实际过程被简化。