首页 > 解决方案 > 变异数据框以检查两个数据框之间的数据是否重复

问题描述

我有两个数据框,这只是一个示例,数据库有大约 100 万条记录。可以有姓名、电子邮件、字母数字代码等。

data1<-data.frame(
  'ID 1' = c(86364,"ARV_2612","AGH_2212","IND_2622","CHG_2622"),
  sector = c(3,3,1,2,5),
  name=c("nhug","hugy","mjuk","ghtr","kuld"),
  'Enternal code'=c(1,1,1,1,3),
  col3=c(1,1,0,0,0),
  col4=c(1,0,0,0,0),
  col5=c(1,0,1,1,1)
)

data2<-data.frame(
  'ID 1' = c(53265,"ARV_7362",76354,"IND_2622","CHG_9762"),
  sector = c(3,3,1,2,5),
  name=c("nhug","hugy","mjuk","ghtr","kuld"),
  'Enternal code'=c(1,1,1,1,3),
  col3=c(1,1,0,0,0),
  col4=c(1,0,0,0,0),
  col5=c(1,0,1,1,1)
)
data2 %>% mutate(
  duplicated = factor(if_else(`ID 1` %in% 
                                pull(data1, `ID 1`),
                              1, 
                              0)))

现在我正在寻找一种函数来改变我的一个数据框(data2)之类的。如果我给出 data1 和 data2 的列名以查找值或字符串是否已存在于其他数据中,并将新列更改为 1,0 以表示真假。功能就像

func(data1 = "name",data2="name",mutated_com="name_exist")

标签: rfunctiondplyr

解决方案


在基础 R 中,您可以将此函数编写为:

func <- function(data1, data2, data1col, data2col, newcol) {
  data2[[newcol]] <- factor(as.integer(data2[[data2col]] %in% data1[[data1col]]))
  data2
}

并可以将其称为:

func(data1, data2, 'name', 'name', 'duplicate')

这将创建一个名为duplicatein的列,data2其中名称 indf2也存在于nameof 中df1,否则为 0。


使用dplyr上面的语法可以写成:

library(dplyr)
library(rlang)

func <- function(data1, data2, data1col, data2col, newcol) {
  data2 %>% 
       mutate(!!newcol := factor(as.integer(.data[[data2col]] %in% 
                                  data1[[data1col]])))
}

推荐阅读