首页 > 解决方案 > 从文本中提取房间测量值

问题描述

我正在尝试从文本数据中提取房间测量值,但无法找到一种可以满足所有可能性的方法。

样本数据:


room_info <- c(
  "Lounge (3.66m x 3.66m (12'0\" x 12'0\"))",
  "Dining Kitchen (4.39m x 3.66m (14'5 x 12'0\"))",
  "Bedroom One (3.73m x 3.73m (12'3\" x 12'3\"))",
  "Bedroom Two (3.53m x 1.98m (11'7\" x 6'6\"))",
  "Shower Room (2.06m x 1.52m (6'9\" x 5'0\"))",
  "Occasional Loft Room (4.04m x 3.78m (13'3\" x 12'5\"))",
  "En-Suite Bathroom (3.18m x 1.98m (10'5\" x 6'6\"))"
  )

###Desired Output:

room_measurements <- tibble(
  meas_1 = c(3.66, 4.39, 3.73, 3.53, 2.06, 4.04, 3.18), 
  meas_2 = c(3.66, 3.66, 3.73, 1.98, 1.52, 3.78, 1.98)
)

我将以下内容放在一起,这适用于某些但并非所有的最后一个值不正确。由于某种原因,a-出现在数据抛出substr.

我有理由相信测量值不会超过 9.99m,因此总长度不应超过 4 个字符。

room_info %>% 
  gsub("[^0-9.-]", "", .) %>%
  as_tibble() %>% mutate(
  meas_1 = as.numeric(substr(value, 1,4)),
  meas_2 = as.numeric(substr(value, 5,8)),
) %>% select(-1) 

# A tibble: 7 x 2
  meas_1 meas_2
   <dbl>  <dbl>
1   3.66   3.66
2   4.39   3.66
3   3.73   3.73
4   3.53   1.98
5   2.06   1.52
6   4.04   3.78
7  -3.1   81.9 

标签: rregex

解决方案


我们可以使用str_extract正则表达式环视来提取在(`x 和空格之后或之后的数字子字符串

library(dplyr)
library(stringr)
tibble(text = room_info) %>% 
    transmute(meas_1 = str_extract(text, "(?<=\\()[0-9.]+"), 
              meas_2 = str_extract(text, "(?<=x )[0-9.]+")) %>%
     type.convert(as.is = TRUE)

-输出

# A tibble: 7 x 2
#  meas_1 meas_2
#   <dbl>  <dbl>
#1   3.66   3.66
#2   4.39   3.66
#3   3.73   3.73
#4   3.53   1.98
#5   2.06   1.52
#6   4.04   3.78
#7   3.18   1.98

read.tablebase R数据中提取子字符串后使用

read.table(text = gsub("[a-z]", "", sub(".*\\((.*)\\s*\\(.*", 
   "\\1", room_info)), header = FALSE, col.names = c('meas_1', 'meas_2'))

-输出

#   meas_1 meas_2
#1   3.66   3.66
#2   4.39   3.66
#3   3.73   3.73
#4   3.53   1.98
#5   2.06   1.52
#6   4.04   3.78
#7   3.18   1.98

在 OP 的帖子中,显示的最后一个值-是因为 in gsub,它正在删除除数字(0-9.-)之外的所有字符,并且-来自En-Suite


推荐阅读