【问题标题】:subsetting data frame based on search pattern in vector基于向量中搜索模式的子集数据框
【发布时间】:2013-12-07 11:40:36
【问题描述】:

我花了几个小时来解决基于向量中的搜索模式对数据框行进行子集的问题。我是R中的新手。也许这很容易,但我自己做不到,我在stackoverflow中找不到解决方案

假设我有一个来自 R 的 mtcars 数据。

我想用一些汽车名称对行进行子集化,例如只有马自达、福特和雪佛兰。所以我有一个字符向量 car.names ,其中包含我想要子集的汽车名称:

car.names <- c("Mazda", "Ford", "Chevrolet")

问题是:如何根据 car.names 中的条件对 mtcars 行进行子集化?

【问题讨论】:

    标签: r


    【解决方案1】:

    我认为您希望将grep 搜索与索引结合起来。这是我要接近它mtcars

    car.names <- "Mazda|Ford|Chevrolet"
    filtered <- mtcars[grepl(car.names, rownames(mtcars)),]
    filtered
    #                mpg cyl disp  hp drat    wt  qsec vs am gear carb
    # Mazda RX4      21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
    # Mazda RX4 Wag  21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
    # Ford Pantera L 15.8   8  351 264 4.22 3.170 14.50  0  1    5    4
    

    【讨论】:

    • 非常感谢。我确信必须使用 grepl 来完成,但我的错误在于创建向量。
    【解决方案2】:

    alexwhan 的回答也是我处理这个问题的方式,但我想我会分享这个答案,以防它对其他人有帮助:您可以考虑使用 Vectorize 创建 grep 的“矢量化”版本:

    vGrep <- Vectorize(grep, vectorize.args="pattern")
    

    这是输出的样子:

    vGrep(car.names, rownames(mtcars))
    # $Mazda
    # [1] 1 2
    # 
    # $Ford
    # [1] 29
    # 
    # $Chevrolet
    # integer(0)
    

    您可以unlist 输出使用从您的data.frame 子集的值:

    mtcars[unlist(vGrep(car.names, rownames(mtcars))), ]
    #                 mpg cyl disp  hp drat    wt  qsec vs am gear carb
    # Mazda RX4      21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
    # Mazda RX4 Wag  21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
    # Ford Pantera L 15.8   8  351 264 4.22 3.170 14.50  0  1    5    4
    

    【讨论】:

    • 谢谢阿南达,您的回答非常好,因为在我的情况下,我更喜欢向量中的模式。再次感谢
    • @sms,感谢您的接受,但我认为@alexwhan 的回答实际上是更常见的方式。您可以使用paste(car.names, collapse = "|") 从您的向量中自动创建搜索模式。因此,对于一个完整的解决方案,您可以:mtcars[grep(paste(car.names, collapse = "|"), rownames(mtcars)), ].
    猜你喜欢
    • 2012-11-17
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    相关资源
    最近更新 更多