You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 07:01:09