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

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

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

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

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

【问题讨论】:

    标签: r subset


    【解决方案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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-10
      • 2018-10-08
      • 2018-09-15
      • 2020-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多