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
相关产品推荐
相关产品推荐

