检查列 A 的值是否存在于列 B 的同一行或前几行中

Check if value of column A is present in the same row or previous rows of column 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 1
2 2 5
3 3 2
4 4 3
5 5 3

我想得到这个结果:

  A B Result
1 1 1      B
2 2 5   <NA>
3 3 2   <NA>
4 4 3   <NA>
5 5 3      B

策略:

  1. 检查是否 A==B 然后将 B 分配给新列 Result 如果不是 NA.
  2. 但也对 B.
  3. 的所有 PREVIOUS 行执行此操作

目标:

我想了解如何检查第 A 列的某个值是否在第 5 行 位于 B 列的前几行(例如第 1-4 行)。

希望以下代码适合您的一般情况

transform(
  df,
  Result = replace(rep(NA, length(B)), match(A, B) <= seq_along(A), "B")
)

这给出了

  A B Result
1 1 1      B
2 2 5   <NA>
3 3 2   <NA>
4 4 3   <NA>
5 5 3      B

只需对@ThomasIsCoding 的答案进行一些小改动,使其成为 dplyr。在我看来,稍微布局更容易阅读。

library(tidyverse)
df <- structure(list(A = 1:5, B = c(1L, 5L, 2L, 3L, 3L)), 
                class = "data.frame", row.names = c(NA, -5L))
match(df$A, df$B)
#> [1]  1  3  4 NA  2
df %>% mutate(Result = if_else(match(A, B) <= row_number(), 
                               "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

由 reprex 包 (v1.0.0) 创建于 2021-08-26

我们可以使用

library(dplyr)
library(purrr)
df %>% 
   mutate(Result = map_chr(row_number(), ~ case_when(A[.x] %in% B[seq(.x)]~ "B")))

-输出

 A B Result
1 1 1      B
2 2 5   <NA>
3 3 2   <NA>
4 4 3   <NA>
5 5 3      B

这是一个dplyr::rowwise方法:

library(dplyr)

df %>%
  rowwise %>% 
  mutate(result = ifelse(A %in% .[seq(cur_group_rows()),]$B, "B", NA))

#> # A tibble: 5 x 3
#> # Rowwise: 
#>       A     B result
#>   <int> <int> <chr> 
#> 1     1     1 B     
#> 2     2     5 <NA>  
#> 3     3     2 <NA>  
#> 4     4     3 <NA>  
#> 5     5     3 B

reprex package (v0.3.0)

于 2021-08-26 创建