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

时间:2013-01-07 22:56:31

标签: r subset

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

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

在我使用过的任何其他程序中,这都很容易,但是做了一些研究后,我正在努力让自己更加困惑。鉴于R的目的和它的作用,这必须是非常简单的东西。

我如何将上述条件应用于表格?步骤是什么?根据我的理解,我不能轻易地根据他们的名字选择表格标题,这样会很好(例如WHERE city< 1,000,000)

2 个答案:

答案 0 :(得分:17)

给定一个数据框“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" ]

请注意,列名未在子集中引用或在“$”运算符后引用,但它们在“[[”

中引用

答案 1 :(得分:12)

您正在寻找subset

如果您的数据被调用mydata

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

或者您可以使用[programatically safer

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

对于多个条件,请使用&|其中approriate

您还可以使用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]