R语言separate函数如何仅按首个空格拆分列并保留AM/PM标识
按首个空格拆分日期时间列、保留AM/PM标识的解决方案
tidyr包的separate()函数支持自定义拆分次数,你之前丢失AM/PM的原因是默认参数会按所有空格位置切割,超出2个目标列的内容会被直接丢弃,调整参数即可解决,该方法对sleep数据集的SleepDay列、weight_log数据集的Date列通用。
方法1:极简写法(推荐)
不需要写复杂正则,只需要加extra = "merge"参数,函数就会自动只按第一个空格拆分,剩余内容全部合并到最后一列,不会丢失AM/PM:
# 处理weight_log数据集示例 separate(weight_log, Date, into = c("Date", "Time"), sep = " ", extra = "merge") # 处理sleep数据集示例 separate(sleep, SleepDay, into = c("Date", "Time"), sep = " ", extra = "merge")
方法2:正则精准匹配写法
如果需要严格限定拆分位置(避免日期格式异常时拆分错误),可以用正向零宽断言匹配日期末尾的第一个空格作为拆分点:
separate(weight_log, Date, into = c("Date", "Time"), sep = "(?<=^\\d{1,2}/\\d{1,2}/\\d{4}) ", extra = "merge")
- 正则
(?<=^\\d{1,2}/\\d{1,2}/\\d{4})的含义是:匹配字符串开头「月/日/年」格式内容后面紧跟的第一个空格,仅在该位置拆分 extra = "merge"为兜底配置,确保拆分点后的所有内容都保留在Time列
拆分后预期效果
以weight_log数据集为例,拆分后Time列会完整保留时间和AM/PM标识:
Id Date Time WeightKg WeightPounds Fat BMI IsManualReport LogId 1 1503960366 5/2/2016 11:59:59 PM 52.6 115.9631 22 22.65 True 1.462234e+12 2 1503960366 5/3/2016 11:59:59 PM 52.6 115.9631 NA 22.65 True 1.462320e+12 3 1927972279 4/13/2016 1:08:52 AM 133.5 294.3171 NA 47.54 False 1.460510e+12
注:两个数据集的日期时间列格式完全一致,上述代码替换对应列名即可直接复用。
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

