使用多个条件对数据框进行子集筛选

3
假设我的数据长这样:
2372  Kansas KS2000111 HUMBOLDT, CITY OF    ATRAZINE    1.3 05/07/2006
9104  Kansas KS2000111 HUMBOLDT, CITY OF    ATRAZINE   0.34 07/23/2006
9212  Kansas KS2000111 HUMBOLDT, CITY OF    ATRAZINE   0.33 02/11/2007
2094  Kansas KS2000111 HUMBOLDT, CITY OF    ATRAZINE    1.4 05/06/2007
16763 Kansas KS2000111 HUMBOLDT, CITY OF    ATRAZINE   0.61 05/11/2009
1076  Kansas KS2000111 HUMBOLDT, CITY OF METOLACHLOR   0.48 05/12/2002
1077  Kansas KS2000111 HUMBOLDT, CITY OF METOLACHLOR    0.3 05/07/2006

我希望能够通过分析物和部分匹配日期(只需要年份)来进行子集操作。我一直在尝试,但是我知道这并不完全正确。

 data[data$Analyte=="ATRAZINE" & grep("2006",as.character(data$Date)),]

有什么建议吗?

1
相关问题:https://dev59.com/eHI_5IYBdhLWcg3wEe1u 和 http://stackoverflow.com/questions/2844669/r-question-create-new-data-set-that-meets-all-of-4-conditions/2844687#2844687 - Shane
3个回答

3

对于这个问题,我会采用Apprentice Queue的答案中提取日期年份的方法,而不是进行通用字符串匹配。我建议:

data[data$Analyte =="ATRAZINE"
     & as.POSIXlt(data$Date, format="%m/%d/%Y")$year == 106]

但是如果你真的需要进行正则表达式匹配,你可以使用grepl,它会返回一个逻辑向量,而不是grep,它返回一个索引向量。

data[data$Analyte=="ATRAZINE" & grepl("2006",as.character(data$Date)),]

2

使用日期字面量的一种方法:

data[data$Analyte =="ATRAZINE"
     & (data$Date >= '2006-01-01' & data$Date < '2007-01-01')]

使用format的另一种方式

data[data$Analyte =="ATRAZINE"
     & format(data$Date, "%Y") == '2006']

3
使用subset可以跳过 $ 符号的引用,例如:subset(data, Analyte=="ATRAZINE" & format(Date, "%Y")=="2006")。在您的第一个解决方案中需要使用as.Date - Marek
1
不需要使用as.Date,因为R会自动将其转换为Date类型。 - Apprentice Queue
我的错误。我不清楚这是在哪个版本的R中更改的。我曾经在 R-2.2.0 中出现过一个错误,从那时起我一直使用as.Date。现在是重写所有代码的时候了 :) - Marek

0

意译:意识到这个问题已经被问了好几年了,希望能帮助未来的某个人。

使用dplyr进行多条件子集筛选,并在转换为日期类型后检查年份。

library(dplyr)

data %>% filter( Analyte=="ATRAZINE" & format(as.Date(Date,format = "%m/%d/%Y"),"%Y") == "2006") 

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