如何用dplyr拆分R数据框中含/不含编号的日期列
解决方案
你的问题出在使用separate时没指定精准的分隔符,默认的拆分规则会把日期里的斜杠也当成拆分依据,直接把日期拆成了零散的数字段,导致结果完全错乱。下面提供两种可靠的处理方法:
方法一:精准拆分后处理缺失值
利用tidyr::separate指定只在空格+[的位置拆分,再统一处理调查编号的格式:
library(dplyr) library(tidyr) library(stringr) # 加载测试数据 Df <- structure(list(Survey_No = 1:20, Date = c("08/01/2012", "06/02/2012", "07/02/2012", "12/02/2012", "13/02/2012", "14/02/2012", "15/02/2012", "20/02/2012", "22/02/2012", "23/03/2012", "08/04/2012", "15/04/2012 [S1]", "15/04/2012 [S2]", "16/04/2012 [S1]", "16/04/2012 [S2]", "20/04/2012", "21/04/2012 [S1]", "21/04/2012 [S2]", "23/04/2012", "24/04/2024 [S1]" )), row.names = c(NA, -20L), class = "data.frame") # 处理流程 Df_processed <- Df %>% # 仅在"空格+["处拆分,纯日期行保留空的Survey_Number separate(Date, into = c("Date", "Survey_Number"), sep = " \\[", keep_empty = TRUE) %>% # 去掉编号里的"]",空值替换为0,提取数字部分 mutate( Survey_Number = str_remove(Survey_Number, "\\]"), Survey_Number = ifelse(is.na(Survey_Number) | Survey_Number == "", "0", str_extract(Survey_Number, "\\d+")) ) print(Df_processed)
方法二:直接提取目标内容
用stringr的正则提取功能,跳过拆分步骤,直接从原字符串里抓取日期和编号:
library(dplyr) library(stringr) Df_processed <- Df %>% mutate( # 提取日期:从开头到第一个空格前的内容(纯日期则取整串) Date = str_extract(Date, "^[^\\s]+"), # 提取调查编号:匹配[S后面的数字,无编号则填0 Survey_Number = case_when( str_detect(Date, "\\[S\\d+\\]") ~ str_extract(Date, "(?<=\\[S)\\d+"), TRUE ~ "0" ) ) %>% select(Survey_No, Date, Survey_Number) print(Df_processed)
两种方法都能实现你的需求:纯日期行的Survey_Number填充为0,带编号的行正确拆分出日期和调查数字。
内容的提问来源于stack exchange,提问作者Alice Hobbs
相关产品推荐
相关产品推荐

