我有两个数据帧,这只是一个示例,数据库有大约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以表示true和false。功能类似
func(data1="名称",data2="名称"、mutated_com="名称存在"(
在基本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')
这将在data2
中创建一个名为duplicate
的列,给出1,其中df2
中的名称也存在于df1
的name
中,否则为0。
使用dplyr
语法,上述内容可以写成:
library(dplyr)
library(rlang)
func <- function(data1, data2, data1col, data2col, newcol) {
data2 %>%
mutate(!!newcol := factor(as.integer(.data[[data2col]] %in%
data1[[data1col]])))
}
您可以使用inner_join(来自dplyr(来确定两个数据帧之间的重叠。若要使用所有列(如果两个数据帧具有相同的列名(,则不必指定"by"参数。
然后,您可以添加一个列"duplicate"并连接回原始数据帧(df1或df2(,以获得所需的结果。
overlap <- data1 %>%
inner_join(data2) %>%
mutate(duplicated = 1)
data1 %>% #or data2
left_join(overlap) %>%
mutate(duplicated = ifelse(is.na(duplicated),0,1))