gpt4 book ai didi

r - 比较两列以在两列中返回相等的值

转载 作者:行者123 更新时间:2023-12-05 05:46:11 25 4
gpt4 key购买 nike

我的表(称为 MGIT)中有四个 ID 列:Ext_ID_1 到 _4。有时相同的数字出现在它们的不同行中,我需要过滤这些行以进行进一步分析,例如:

起始状态:

Ext_ID      Ext_ID_4

1111 2222
3333 4444
5555 1111
6666 7777
8888 9999
9999 1010

期望的过滤结果:

Ext_ID      Ext_ID_4

1111 2222
5555 1111
8888 9999
9999 1010

为了更清晰的管理,我只想一次比较它们两个。

通过之前在StackOverflow的提问,我发现了如下代码:

Dupl = MGIT[,c('Ext_ID','Ext_ID_4')]
Result <- MGIT[duplicated(Dupl) | duplicated(Dupl, fromLast=TRUE),]

但它只返回列的重复值(实际上,仅在 Ext_ID 内,但我相信 ID_4 本身没有重复值)。

我是编程初学者,对这门语言一无所知。

最佳答案

我假设您希望它适用于所有四列,而不仅仅是示例中的两列。

无论您有多少“Ext_ID”列,这里都有一个解决方案:

library(dplyr)

# Recreate the data from your example
df <- tibble::tribble(
~Ext_ID, ~Ext_ID_4,
1111, 2222,
3333, 4444,
5555, 1111,
6666, 7777,
8888, 9999,
9999, 1010
)

# The actual code you need - just replace `df` with the name of your table
df %>%
filter(
if_any(
starts_with("Ext_ID"),
~ .x %>% purrr::map_lgl(~sum(df == .x) > 1)
)
)

# The output:
#> # A tibble: 4 x 2
#> Ext_ID Ext_ID_4
#> <dbl> <dbl>
#> 1 1111 2222
#> 2 5555 1111
#> 3 8888 9999
#> 4 9999 1010

解释:

  • ~ .x %>% purrr::map_lgl(~sum(df == .x) > 1) 检查列中的每个值是否在数据框中出现多次。
  • starts_with("Ext_ID") 确保对所有以“Ext_ID”开头的列完成此操作
  • if_any() 使 filter() 保留任何列的 df 中至少有 1 个重复值的行。

关于r - 比较两列以在两列中返回相等的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71220885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com