如何用R语言(优先lapply)实现字母向量的A/B匹配转换
R语言实现指定向量字符处理(优先使用lapply)
需求说明
给定仅含大写字母的向量,需完成两项处理:
- 有效性校验:每个
A必须在后续存在未配对的B,否则转为C;每个B必须在前置存在未配对的A,否则转为C。 - 区间限制:配对的
A与B之间只能保留C(若有其他字符需转为C)。
示例输入
y <- c("A", "B", "B", "C", "C", "A", "C", "B", "A", "C", "C", "C", "B", "B")
示例输出
y <- c("A", "C", "B", "C", "C", "A", "C", "B", "A", "C", "C", "C", "B", "C")
实现代码
这里优先用lapply完成遍历处理,先通过配对逻辑标记有效字符,再逐个处理:
# 输入向量 y <- c("A", "B", "B", "C", "C", "A", "C", "B", "A", "C", "C", "C", "B", "B") # 1. 找出所有A和B的位置,完成配对标记 a_pos <- which(y == "A") b_pos <- which(y == "B") valid_a <- logical(length(a_pos)) valid_b <- logical(length(b_pos)) current_b <- 1 # 按顺序给每个A匹配后续第一个未被占用的B for (i in seq_along(a_pos)) { # 跳过当前A之前的B while (current_b <= length(b_pos) && b_pos[current_b] < a_pos[i]) { current_b <- current_b + 1 } # 如果找到可用B,标记为有效配对 if (current_b <= length(b_pos)) { valid_a[i] <- TRUE valid_b[current_b] <- TRUE current_b <- current_b + 1 } } # 生成全向量的有效性标记 valid_flag <- rep(FALSE, length(y)) valid_flag[a_pos[valid_a]] <- TRUE valid_flag[b_pos[valid_b]] <- TRUE # 2. 用lapply遍历处理每个元素 processed_vec <- unlist(lapply(seq_along(y), function(idx) { char <- y[idx] if (char %in% c("A", "B")) { # 非有效配对的A/B直接转C if (!valid_flag[idx]) { return("C") } else { # 有效配对的A/B保留原字符 return(char) } } else { # 检查当前字符是否在有效A-B区间内,非C则转C in_valid_range <- FALSE # 遍历所有有效A,看当前位置是否在A和其配对B之间 for (a_idx in which(valid_a)) { paired_b_pos <- b_pos[which(valid_b)[a_idx]] if (a_pos[a_idx] < idx && idx < paired_b_pos) { in_valid_range <- TRUE break } } if (in_valid_range && char != "C") { return("C") } else { return(char) } } })) # 查看结果 processed_vec
运行后输出与示例完全一致:
> processed_vec [1] "A" "C" "B" "C" "C" "A" "C" "B" "A" "C" "C" "C" "B" "C"
逻辑说明
- 配对标记:先把所有A和B的位置提取出来,按顺序给每个A分配后续第一个未被配对的B,这样就能明确哪些A和B是合法的,剩下的都是要转C的。
- lapply遍历:逐个处理每个元素:
- 若是A/B:只保留处于有效配对中的,其余转C;
- 若是其他字符:如果在有效A和其配对B的区间内,且不是C的话就转C(示例中无此场景,代码已兼容)。
内容的提问来源于stack exchange,提问作者Shawn Brar
相关产品推荐
相关产品推荐

