如何在R语言的ifelse中获取满足条件的数据对应的日期时间?
解决方案
原代码通过循环标记符合时间差条件的血糖时间,但未提取对应Time_Glucose值。以下是两种实现方式,兼顾原逻辑和R语言的高效性:
方式1:保留循环逻辑并提取目标时间
在循环中同步存储每个Time_Meal对应的符合条件的Time_Glucose:
# 初始化列表存储匹配到的时间 matched_times <- list() Glucose_4h <- character() for(i in 1:96){ A <- unlist(difftime(Time_Meal[i], Time_Glucose[1:15372], units="mins")) # 生成Inc_G/Exc_G标记 B <- ifelse(as.numeric(A) > 0 & as.numeric(A) < 5.0, "Inc_G","Exc_G") Glucose_4h <- c(Glucose_4h, B) # 提取当前Meal时间对应的符合条件的Glucose时间 matched_TG <- Time_Glucose[as.numeric(A) > 0 & as.numeric(A) < 5.0] matched_times[[i]] <- matched_TG } # 若需合并所有匹配时间为单个向量 all_matched <- do.call(c, matched_times)
matched_times是列表,每个元素对应第i个Time_Meal下满足条件的Time_Glucose集合。
方式2:向量化操作替代循环(更高效)
R中避免循环拼接向量,用向量化操作大幅提升效率:
# 生成所有Time_Meal与Time_Glucose的时间差矩阵 time_diff <- outer(Time_Meal, Time_Glucose, function(x,y) as.numeric(difftime(x, y, units="mins"))) # 生成标记矩阵并转为向量(与原代码结果一致) Glucose_4h <- as.vector(ifelse(time_diff > 0 & time_diff < 5.0, "Inc_G", "Exc_G")) # 提取所有满足条件的Time_Glucose match_pos <- which(time_diff > 0 & time_diff < 5.0, arr.ind = TRUE) all_matched_times <- Time_Glucose[match_pos[,2]] # 按Time_Meal分组存储匹配时间 grouped_matched <- split(all_matched_times, match_pos[,1])
outer函数直接计算所有时间对的差值,比循环高效;grouped_matched按Time_Meal索引分组保存对应匹配时间。
关键提示
- 原代码中
Time_Glucose[1:15372]可直接写为Time_Glucose(若其长度恰好为15372),代码更简洁。 - 提取条件与生成
Inc_G的逻辑完全一致:as.numeric(A) > 0 & as.numeric(A) < 5.0,用该条件索引Time_Glucose即可得到目标值。
内容的提问来源于stack exchange,提问作者user21528954
相关产品推荐
相关产品推荐

