R语言实现元素首次出现识别:重复出现则返回FALSE的算法求助
R语言判断元素首次出现的实现方案
问题说明
需求:对向量的每个位置,若元素为首次出现返回TRUE,此前已出现过返回FALSE
测试用例:
- 输入
x1 = c("LMP","Dp","LMP","LMP","Dp"),预期输出:TRUE, TRUE, FALSE, FALSE, FALSE- 输入
x2 = c("Dp","Dp","LMP","LMP","Dp"),预期输出:TRUE, FALSE, TRUE, FALSE, FALSE
原有代码问题分析
原有代码的判断逻辑length(unique(x[1:i]))==1仅能识别前i个元素是否全为同一个值,无法判断当前位置元素是否在之前的位置单独出现过,因此结果不符合预期。
正确实现方案
方案1:调用R内置函数(性能最优)
直接使用!duplicated(x)即可实现需求,duplicated()函数会返回布尔向量,标记对应位置的元素是否在之前出现过,取反后刚好符合首次出现返回TRUE的要求。
x1 <- c("LMP","Dp","LMP","LMP","Dp") x2 <- c("Dp","Dp","LMP","LMP","Dp") # 测试x1 !duplicated(x1) # 输出:TRUE TRUE FALSE FALSE FALSE # 测试x2 !duplicated(x2) # 输出:TRUE FALSE TRUE FALSE FALSE
方案2:自定义循环实现(手动实现逻辑)
如果需要手写核心判断逻辑,可以用以下代码:
check_first_occur <- function(x) { # 初始化等长结果向量 res <- logical(length(x)) # 存储已经出现过的元素 seen_items <- c() for (i in seq_along(x)) { res[i] <- !x[i] %in% seen_items seen_items <- c(seen_items, x[i]) } return(res) } # 测试 check_first_occur(x1) check_first_occur(x2)
内容的提问来源于stack exchange,提问作者MatCordTo
相关产品推荐
相关产品推荐

