检查列 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
策略:
- 检查是否
A==B
然后将 B
分配给新列 Result
如果不是 NA
.
- 但也对
B
. 的所有 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 创建
我有这个数据框:
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
策略:
- 检查是否
A==B
然后将B
分配给新列Result
如果不是NA
. - 但也对
B
. 的所有 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 创建