在R中基于多个条件删除行

8

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

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      

如果职业为文员且每月支出大于60,则删除这些行。 如果职业为管理人员且每月支出大于57,则删除这些行。 最终结果应该是这样的:

Occupation MonthlySpend
Clerical   58
Management 56

请在您的问题中提供可重现的示例。具体方法请参考如何创建一个完美的 R 可重现示例 - Adam Quek
@AdamQuek 请查看帖子,我已经编辑并附上了一个示例。有没有办法用循环或apply()来实现这个? - Mohamed Khafagy
2个回答

15

使用 OR 运算符将所有条件组合起来:|

例如:

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

简单而美丽,谢谢 :) - bathyscapher

3
你可以尝试像这样做。
步骤 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

这样做,您需要花费一些资源来定义第二个数据帧,但过滤的实际过程则变得更加简化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接