R语言数据清洗求助:拆分departure_info与提取price数值
数据清洗解决方案(针对航班数据拆分与价格提取)
先修正字段拼写错误
你的数据里departue_info是拼写错误,先改成departure_info,后续基于这个修正后的字段处理。
1. 拆分出发信息为时间和日期,处理多值行
原数据中departure_info是字符串格式的列表,先把它拆成单独的条目,再提取时间和日期:
library(tidyverse) # 修正字段名 df1 <- df1 %>% rename(departure_info = departue_info) # 拆分多值行并提取时间、日期 df_clean <- df1 %>% # 将字符串列表拆成多列,再转成多行 unnest_wider(departure_info, names_sep = "_") %>% pivot_longer(cols = starts_with("departure_info_"), names_to = NULL, values_to = "departure_info") %>% drop_na(departure_info) %>% # 正则提取时间和日期 mutate( departure_info_time = str_extract(departure_info, "\\d{2}:\\d{2} [ap]m"), departure_info_day = str_extract(departure_info, "[A-Za-z]{2} \\d{2} [A-Za-z]{3}") ) %>% select(-departure_info)
2. 提取价格数字,匹配多值行
同样处理price字段,拆分多值后提取数字,忽略特殊字符:
df_clean <- df_clean %>% # 拆分价格的字符串列表为多行,和出发信息条目对应 unnest_wider(price, names_sep = "_") %>% pivot_longer(cols = starts_with("price_"), names_to = NULL, values_to = "price") %>% drop_na(price) %>% # 提取数字并转为数值型 mutate(price = as.numeric(str_extract(price, "\\d+")))
关键逻辑说明
- 多值行处理:用
unnest_wider+pivot_longer把包含多个出发时间/价格的行拆成单独观测,这样每个时间对应一个价格,适合后续做趋势散点图。 - 正则匹配规则:
- 时间:
\\d{2}:\\d{2} [ap]m精准匹配"hh:mm am/pm"格式; - 日期:
[A-Za-z]{2} \\d{2} [A-Za-z]{3}匹配"Sa 19 Feb"这类日期格式; - 价格:
\\d+提取所有连续数字,自动忽略后面的<U+0080>特殊字符。
- 时间:
最终数据示例
处理后的数据结构(以FRA-OSL航班为例):
depart destination departure_info_time departure_info_day price 1 FRA OSL 10:25 am Sa 19 Feb 249 2 FRA OSL 16:10 am Sa 19 Feb 249 3 FRA OSL 21:40 am Sa 19 Feb 249 4 FRA OSL 10:25 am Sa 19 Feb 419
内容的提问来源于stack exchange,提问作者Gaaaa
相关产品推荐
相关产品推荐

