首页 > 解决方案 > 从 R 数据框列中选择值

问题描述

我正在使用芝加哥犯罪数据集和 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     |
+--------------------------+-------------+

标签: rtidyr

解决方案


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

推荐阅读