【问题标题】:Select values from R dataframe column从 R 数据框列中选择值
【发布时间】:2020-06-04 00:56:14
【问题描述】:

我正在使用芝加哥犯罪数据集和 R 进行课程项目。数据集中的属性之一是 Block,其中包含事件发生的部分地址。例如:

+--------------------------+
|           Block          |
+--------------------------+
|  45xx N Locust Grove St  |
|   65xx Hawthorne Ave     |
+--------------------------+

Block 中的值长度不同,但我想创建一个街道类型为 St、Ave、Blvd 等的新变量。我尝试使用 tidyr 中的单独函数。

df <- df %>%
   separate(Block, into = c("partial.address, "type"),
           sep = " ", extra = "merge", fill = "left")

但是,这将返回数字 45xx,作为 partial.address 值,其余值在 type 中。如何从地址中选择街道类型?

我希望得到这样的输出:

+--------------------------+-------------+
|     partial.address      |     type    |
+--------------------------+-------------+
|  45xx N Locust Grove     |      St     |
|   65xx Hawthorne         |     Ave     |
+--------------------------+-------------+

【问题讨论】:

    标签: r tidyr


    【解决方案1】:

    你可以使用extract

    tidyr::extract(df, Block, c("partial.address", "type"), "(.*)(St|Ave)")
    
    #      partial.address  type
    #1 45xx N Locust Grove    St
    #2      65xx Hawthorne   Ave
    

    或者使用stringr

    library(dplyr)
    library(stringr)
    
    df %>%
      mutate(type = str_extract(Block, '(St|Ave)'), 
             partial.address = str_remove(Block, type))
    

    如果您有更多模式,您可以在(St|Ave) 中包含更多模式。


    如果我们想捕获每个Block 的最后一个单词,我们可以使用:

    df %>%
      mutate(type = str_extract(Block, '\\w+$'), 
             partial.address = str_remove(Block, type))
    

    数据

    df <- structure(list(Block = c("45xx N Locust Grove St", "65xx Hawthorne Ave"
    )), class = "data.frame", row.names = c(NA, -2L))
    

    【讨论】:

    • 有没有办法在空白处分割并选择最后一个位置的索引来填充变量类型?数据集有 15,000 条记录,有多种街道类型。
    • @miguelf88 查看更新的答案。它选择每个 Block 中的最后一个单词。
    • 感谢@RonakShah。使用带有 '\\w+$' 的 str_extract 有效。我尝试使用 '(St|Ave|Blvd|Rd)' 但该列填充了 NA 值。
    猜你喜欢
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多