gpt4 book ai didi

r - 在 R 中,发现与另一个数据框中的行部分匹配的行

转载 作者:行者123 更新时间:2023-12-01 04:42:03 27 4
gpt4 key购买 nike

我有以下两个数据框:

> df1
# A tibble: 4 x 4
x y z w
<dbl> <dbl> <dbl> <dbl>
4 5 8 9
4 6 7 4
3 6 7 10
8 2 8 9
> df2
# A tibble: 4 x 4
x y z w
<dbl> <dbl> <dbl> <dbl>
6 2 7 9
2 6 7 10
4 5 8 12
4 5 8 3

我想发现 df2 中的哪些行在 df1 中匹配,其中匹配意味着至少在 n/2 列中相同。

因此,在此示例中,df2 中的第 1 行与 df1 中的第 4 行(第 1 和第 3 列)匹配,df2 中的第 2 行匹配第 2 和第 3 列的 df1 中的第 2 行以及第 2、3、4 列的第 3 行,等等在。

我还必须保存重复行的位置和它们匹配的列。

对于小数据集,我可以复制两个数据集并减去它们并计算零。但是,我需要的是一个可以处理非常大的数据集(~20K 行)的解决方案。

有任何想法吗? dplyr 解决方案(而不是 data.table)将受到高度赞赏。

最佳答案

这个最终输出可能不是理想的格式,但它至少应该包含您正在寻找的信息并处理更多的字段/列。

df1 <- read.table(text =
"x y z w
4 5 8 9
4 6 7 4
3 6 7 10
8 2 8 9",
header = T)

df2 <- read.table(text =
"x y z w
6 2 7 9
2 6 7 10
4 5 8 12
4 5 8 3",
header = T)


library(dplyr)
library(tidyr)

为每个数据框添加一个行 ID 号,并使用 gather 将数据从宽变长。 . (我假设每一行都可以被视为一个唯一的 id):
df1 <- df1 %>% 
mutate(df1_id = row_number()) %>%
gather(field, value, x:w) %>%
arrange(df1_id)

df2 <- df2 %>%
mutate(df2_id = row_number()) %>%
gather(field, value, x:w) %>%
arrange(df2_id)

inner_join 连接两个数据框在字段/列和值上。然后使用 groupfilter仅获取具有两个或多个匹配项的字段和值组合
df2 %>% 
inner_join(df1, by = c('value', 'field')) %>%
group_by(df2_id, df1_id) %>%
filter(n()>=2) %>% # where 2 is the minimum number of matches
arrange(df2_id, df1_id, value) %>%
select(df2_id, df1_id, field, value)

# A tibble: 13 x 4
# Groups: df2_id, df1_id [5]
df2_id df1_id field value
<int> <int> <chr> <int>
1 1 4 y 2
2 1 4 w 9
3 2 2 y 6
4 2 2 z 7
5 2 3 y 6
6 2 3 z 7
7 2 3 w 10
8 3 1 x 4
9 3 1 y 5
10 3 1 z 8
11 4 1 x 4
12 4 1 y 5
13 4 1 z 8

您可以看到 df2 行 id 1 与字段 y 和 w 上的 df1 行 4 匹配,
df2 第 2 行与字段 y 和 z 上的 df1 第 2 行匹配,
df2 第 2 行还匹配 df1 第 3 行的字段 y、x 和 w。
df2 第 3 行和第 4 行在 x、y 和 z 上匹配 df1 第 1 行。
arrangeselect实际上只是为了更容易查看数据而必需的。

关于r - 在 R 中,发现与另一个数据框中的行部分匹配的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49588193/

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