根据条件过滤数据框中的数据

Posted

技术标签:

【中文标题】根据条件过滤数据框中的数据【英文标题】:Filtering data in a dataframe based on criteria 【发布时间】:2012-12-21 18:01:21 【问题描述】:

我是 R 新手,无法理解这个概念。假设我有一个名为“places”的表,其中包含 3 个列 - 城市、人口和夏季平均温度

假设我想“过滤” - 生成一个人口少于 100 万且夏季平均温度高于 70 度的新表格对象。

在我使用过的任何其他程序中,这将非常容易,但是在做了一些研究之后,我让自己陷入了更大的困惑。鉴于 R 的目的和它的作用,这一定很简单。

如何将上述条件应用于表格?步骤是什么?据我了解,我不能轻易地根据名称选择表格标题,这会很好(例如 WHERE city

【问题讨论】:

【参考方案1】:

给定一个数据框“dfrm”,其中包含“城市”列中的城市名称、“人口”列中的人口和“meanSummerT”列中的夏季平均温度,您对满足这些联合要求的子集的请求会遇到以下任何一种情况:

subset( dfrm, population < 1e6 & meanSummerT > 70)
dfrm[ which(dfrm$population < 1e6 & dfrm$meanSummerT > 70) , ]
dfrm[ which( dfrm[[ 'population' ]] < 1e6 & dfrm[[ 'meanSummerT' ]] > 70) , ]

如果您只想要符合这些联合标准的城市名称,那么这些会起作用:

subset( dfrm, population < 1e6 & meanSummerT > 70 , city)
dfrm[ which(dfrm$population < 1e6 & dfrm$meanSummerT > 70) , "city" ]
dfrm[ which(dfrm[['population']] < 1e6 & dfrm[['meanSummerT']] > 70) , "city" ]

请注意,列名没有在子集中或在“$”运算符之后被引用,而是在“[[”中被引用。请注意,如果没有数据行匹配,使用which 可能会很危险,因为您将获得整个数据帧,而不是没有行。

【讨论】:

@mnel 还提到了 'sqldf' 包,如果他的回答使用了合理的列名,我只会对其进行投票,而不是发布另一个答案。我的回答没有使用其他包,但 data.table 包绝对是当您的数据扩展到千兆字节时需要考虑的资源。【参考方案2】:

您正在寻找subset

如果您的数据被称为mydata

newdata <- subset(mydata, city < 1e6)

或者您可以使用[,即programatically safer

newdata <- mydata[mydata$city < 1e6]

对于多个条件,在适当的地方使用&amp;|

您也可以使用sqldf 包来使用sql

library(sqldf)

newdata <-  sqldf('select * from mydata where city > 1e6')

或者您可以使用data.table,这使得[ 的语法更容易(以及内存效率)

library(data.table)

mydatatable <- data.table(mydata)
newdata <- mydatatable[city > 1e6]

【讨论】:

以上是关于根据条件过滤数据框中的数据的主要内容,如果未能解决你的问题,请参考以下文章

会员管理小程序实战开发教程-按条件过滤数据

Pyhton编程技巧-根据条件过滤list,dict,set中的数据

熊猫:考虑多种条件正确过滤数据框列

根据 Pandas 中的条件过滤行

SQL系列—— 过滤(where)

高级过滤器,为1行选择了多个条件