r-提取字符变量的特定信息



对于一个附带项目,我目前正在尝试基于这些数据(一种散点图(制作一个面板,其中有日期以及价格如何随时间变化。我目前处于最困难的状态之一(数据清理(。为了提取信息,我正在尝试拆分变量。例如,在变量departure_info中,我想划分为变量departure_info_timedeparture_info_day。此外,在变量price中,我想提取358、480、590等数字。

df1 <- data.frame(depart = c("OSL", "WAW", "VIE", "MUC", "FRA"),
destination = c("KEF", "ARN", "RIX", "VCE", "OSL"),
departue_info = c("['12:45 am Sa 19 Feb']", "['07:55 am Sa 19 Feb']", "['09:05 am Sa 19 Feb']", "['21:45 am Sa 19 Feb', '15:30 am Sa 19 Feb']", "['10:25 am Sa 19 Feb', '16:10 am Sa 19 Feb', '21:40 am Sa 19 Feb']"),
price = c("['358<U+0080>']", "['480<U+0080>']", "['590<U+0080>']", "['354<U+0080>', '418<U+0080>']", "['249<U+0080>', '249<U+0080>', '249<U+0080>', '419<U+0080>']"))

如果有人能帮我,我会很感激。我试过str_extract()gsub(),但都没能成功。如果有人能给我一个建议,我也会很感激,如果在一排中我有几个价格,而在另一排中只有一个。

我感谢你的帮助:(

看起来departure_info中的每个项目都有固定数量的字符,所以我使用substr提取第3个到第10个字符的时间和第12个到第20个字符的日期的子字符串。

我们可以对价格采取同样的方法,但这是一个简单的正则表达式模式,用于查找一个或多个数字"\d+",所以我只将其与str_extract一起使用,它将提取模式的第一个出现,即price字符串中的第一组连续数字。

library(stringr)
library(dplyr)
df1 %>%
mutate(
depart_time = substr(departue_info, start = 3, stop = 10),
depart_date = substr(departue_info, start = 12, stop = 20),
price_num = as.numeric(str_extract(price, "\d+"))
)
#   depart destination                                                      departue_info
# 1    OSL         KEF                                             ['12:45 am Sa 19 Feb']
# 2    WAW         ARN                                             ['07:55 am Sa 19 Feb']
# 3    VIE         RIX                                             ['09:05 am Sa 19 Feb']
# 4    MUC         VCE                       ['21:45 am Sa 19 Feb', '15:30 am Sa 19 Feb']
# 5    FRA         OSL ['10:25 am Sa 19 Feb', '16:10 am Sa 19 Feb', '21:40 am Sa 19 Feb']
#                                                          price depart_time depart_date price_num
# 1                                              ['358<U+0080>']    12:45 am   Sa 19 Feb       358
# 2                                              ['480<U+0080>']    07:55 am   Sa 19 Feb       480
# 3                                              ['590<U+0080>']    09:05 am   Sa 19 Feb       590
# 4                               ['354<U+0080>', '418<U+0080>']    21:45 am   Sa 19 Feb       354
# 5 ['249<U+0080>', '249<U+0080>', '249<U+0080>', '419<U+0080>']    10:25 am   Sa 19 Feb       249

如果你想得到所有的价格数字,我们将首先去掉U0080,然后使用str_extract_all而不是str_extract。这将生成一个list列,然后您可以以各种方式使用它。。。

df1 %>%
select(price) %>%
mutate(
price_num = price %>% str_replace_all(fixed("U+0080"), "") %>% str_extract_all("\d+")
)
#                                                         price          price_num
# 1                                              ['358<U+0080>']                358
# 2                                              ['480<U+0080>']                480
# 3                                              ['590<U+0080>']                590
# 4                               ['354<U+0080>', '418<U+0080>']           354, 418
# 5 ['249<U+0080>', '249<U+0080>', '249<U+0080>', '419<U+0080>'] 249, 249, 249, 419

最新更新