R语言如何判断A列值是否存在于当前行及之前的B列中
R语言校验A列值是否存在于B列前序(含当前)行的实现方案
示例数据集
给定的测试数据如下:
df <- structure(list(A = 1:5, B = c(1L, 5L, 2L, 3L, 3L)), class = "data.frame", row.names = c(NA, -5L))
原始数据预览:
| A | B |
|---|---|
| 1 | 1 |
| 2 | 5 |
| 3 | 2 |
| 4 | 3 |
| 5 | 3 |
需求拆解
对每行i做如下校验:
- 校验范围是
B列第1行到第i行(含当前行) - 若
A[i]存在于上述范围内,Result赋值为B,否则赋值为NA
实现代码
基础R实现(无额外依赖)
df$Result <- sapply(seq_len(nrow(df)), function(i) { ifelse(df$A[i] %in% df$B[1:i], "B", NA_character_) })
tidyverse生态实现
library(dplyr) library(purrr) df <- df %>% mutate(Result = map2_chr(A, row_number(), ~ifelse(.x %in% B[1:.y], "B", NA_character_)))
输出结果
运行后得到的结果和预期完全一致:
A B Result 1 1 1 B 2 2 5 <NA> 3 3 2 <NA> 4 4 3 <NA> 5 5 3 B
扩展用法
如果需要校验的是不含当前行的前序行(比如第5行只校验B列1-4行),只需调整校验范围即可:
df$Result <- sapply(seq_len(nrow(df)), function(i) { # 第一行无前序行直接返回NA if(i == 1) return(NA_character_) ifelse(df$A[i] %in% df$B[1:(i-1)], "B", NA_character_) })
内容的提问来源于stack exchange,提问作者TarJae
相关产品推荐
相关产品推荐

