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

R语言dataframe逗号分隔字符转数值向量及差值统计方法

实现方案

你之前把同组snzeit值拼接为逗号分隔字符串属于冗余中间步骤,既可以选择拆分已生成的字符串列完成计算,也可以直接基于原始数值列跳过拼接步骤统计,两种方法都能实现需求。

处理已生成的time_vec字符串列

如果已经生成了逗号拼接的time_vec列,可通过字符串拆分+类型转换得到数值向量,再完成差值统计,代码如下:

library(tidyverse)

# 读入示例测试数据
fall_hc <- tibble::tribble(
              ~a_dat,  ~AZeit, ~snzeit,
        "2019-01-02", "24180",      31,
        "2019-01-02", "24360",      27,
        "2019-01-02", "24480",      16,
        "2019-01-02", "24780",      64,
        "2019-01-02", "30420",       9,
        "2019-01-02", "30840",      10,
        "2019-01-02", "35280",      31,
        "2019-01-03", "24120",      40,
        "2019-01-03", "24120",      27,
        "2019-01-03", "24480",       6,
        "2019-01-03", "24480",       4,
        "2019-01-03", "24780",       9,
        "2019-01-03", "25380",      25,
        "2019-01-03", "26460",      33,
        "2019-01-04", "24000",       5,
        "2019-01-04", "24360",       2,
        "2019-01-04", "24900",       1,
        "2019-01-04", "27180",      29,
        "2019-01-04", "30600",       8,
        "2019-01-07", "24780",      25,
        "2019-01-07", "24840",       4,
        "2019-01-07", "28920",       3,
        "2019-01-07", "31620",      11,
        "2019-01-08", "24060",      46,
        "2019-01-08", "24480",       7,
        "2019-01-08", "25260",       4,
        "2019-01-08", "27900",       5,
        "2019-01-08", "29820",       5,
        "2019-01-08", "30060",      74,
        "2019-01-08", "33360",       5,
        "2019-01-08", "33600",      28,
        "2019-01-08", "34200",      15,
        "2019-01-08", "35520",      13,
        "2019-01-08", "36000",      19,
        "2019-01-08", "44100",      24
        )

# 按原有逻辑生成带time_vec列的数据集
df_with_vec <- fall_hc %>% 
  group_by(a_dat) %>%
  mutate(time_vec = str_c(snzeit,collapse= ",")) %>% 
  ungroup() %>% 
  filter(!is.na(time_vec))

# 拆分字符串转数值,统计负差值数量
df_res <- df_with_vec %>%
  group_by(a_dat) %>%
  summarise(
    # 同组time_vec值完全一致,取第一个值拆分转数值即可
    time_num = list(as.numeric(strsplit(first(time_vec), ",")[[1]])),
    # 计算相邻元素差值,统计小于0的差值个数
    neg_diff_count = sum(diff(time_num[[1]]) < 0),
    .groups = "drop"
  )

针对示例字符串"5, 31, 16, 64, 9, 10, 31",上述拆分逻辑转换后得到的数值向量为c(5, 31, 16, 64, 9, 10, 31),调用diff()计算得到的差值与预期的26 -15 48 -55 1 21完全一致。

跳过字符串拼接直接统计(推荐)

数值型字段先拼接为字符串再拆分转回数值属于不必要的性能损耗,数据集已完成排序的前提下,可直接在分组阶段基于原始snzeit列完成统计,代码更简洁、运行效率更高:

final_res <- fall_hc %>%
  group_by(a_dat) %>%
  summarise(
    neg_diff_count = sum(diff(snzeit) < 0),
    .groups = "drop"
  ) %>%
  # 负差值数量为0时,当日手术时长序列为非递减,即按从短到高升序排列
  filter(neg_diff_count == 0)
统计结果说明

基于提供的示例数据运行后,无符合“当日手术按时长从短到长升序排列”要求的日期,各日期负差值统计结果如下:

  • 2019-01-02:负差值共3个
  • 2019-01-03:负差值共1个
  • 2019-01-04:负差值共2个
  • 2019-01-07:负差值共2个
  • 2019-01-08:负差值共5个

若业务要求手术时长严格递增(即相邻手术时长相等也不符合升序要求),可将判断条件修改为sum(diff(snzeit) <= 0),筛选该值为0的日期即可。

内容的提问来源于stack exchange,提问作者Peter Hahn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:36:16