使用R将数据集缩减为只有在两个独立列中具有匹配数据的行

使用R将数据集缩减为只有在两个独立列中具有匹配数据的行,r,bigdata,R,Bigdata,我试图将海量数据集简化为仅与“FIRSTNAME”列和“SSN”列匹配的行。为了帮助澄清,我做了一个小的设置 非常小的样本 CUSTNUM FIRSTNAME SSN 1234 Matt 111 4321 Mark 222 5678 Mike 333 9875 Matt 444 1092 Matt 111 我要它回来 CUSTNUM FIRSTNAME SSN 1234 Matt 111 1092

我试图将海量数据集简化为仅与“FIRSTNAME”列和“SSN”列匹配的行。为了帮助澄清,我做了一个小的设置

非常小的样本

CUSTNUM FIRSTNAME SSN
 1234     Matt    111
 4321     Mark    222
 5678     Mike    333
 9875     Matt    444
 1092     Matt    111
我要它回来

CUSTNUM FIRSTNAME SSN
 1234     Matt    111
 1092     Matt    111
因为它们在两列中都匹配


我的数据集中有超过200万行的客户数据,因此我需要一种识别可能重复记录的方法

在base r中有一个方便的函数:

# suppose you have a dataframe, df, and you want to know which rows 
# have duplicate values in both the FIRSTNAME and SSN columns together:
df$dup <- duplicated(df[,c('name','SSN')],fromLast=FALSE)
df$dup <- ifelse(duplicated(df[,c('name','SSN')],fromLast=TRUE),yes=TRUE,no=df$dup)

# return dups
df.answer <- df[which(df$dup),]
#假设您有一个数据帧df,您想知道哪些行
#FIRSTNAME和SSN列中的值都是重复的:

df$dup在base r中有一个方便的函数:

# suppose you have a dataframe, df, and you want to know which rows 
# have duplicate values in both the FIRSTNAME and SSN columns together:
df$dup <- duplicated(df[,c('name','SSN')],fromLast=FALSE)
df$dup <- ifelse(duplicated(df[,c('name','SSN')],fromLast=TRUE),yes=TRUE,no=df$dup)

# return dups
df.answer <- df[which(df$dup),]
#假设您有一个数据帧df,您想知道哪些行
#FIRSTNAME和SSN列中的值都是重复的:

df$dup或者,使用
dplyr

library(tidyverse)

df %>% 
  group_by(FIRSTNAME, SSN) %>% 
  filter(n() > 1)

# A tibble: 2 x 3
# Groups:   FIRSTNAME, SSN [1]
  CUSTNUM FIRSTNAME   SSN
    <int>    <fctr> <int>
1    1234      Matt   111
2    1092      Matt   111
库(tidyverse)
df%>%
分组人(名字,SSN)%>%
过滤器(n()>1)
#一个tibble:2x3
#组:名字,SSN[1]
CUSTNUM FIRSTNAME SSN
11234马特111
21092马特111

或者,使用
dplyr

library(tidyverse)

df %>% 
  group_by(FIRSTNAME, SSN) %>% 
  filter(n() > 1)

# A tibble: 2 x 3
# Groups:   FIRSTNAME, SSN [1]
  CUSTNUM FIRSTNAME   SSN
    <int>    <fctr> <int>
1    1234      Matt   111
2    1092      Matt   111
库(tidyverse)
df%>%
分组人(名字,SSN)%>%
过滤器(n()>1)
#一个tibble:2x3
#组:名字,SSN[1]
CUSTNUM FIRSTNAME SSN
11234马特111
21092马特111

Try with
duplicated
df[duplicated(df[2:3])duplicated(df[2:3],fromLast=TRUE),]
尝试
duplicated
df[duplicated(df[2:3])duplicated(df[2:3],fromLast=TRUE),]
我认为你的
ifelse
可以简化为
duplicated(df[,c('name','SSN'),fromLast=TRUE)| df$dup
。如果你想加快速度,只需将
dup
作为一个向量,而不是将它添加到数据帧中。我认为你的
ifelse
可以简化为
复制(df[,c('name','SSN')],fromLast=TRUE)| df$dup
。如果你想加快速度,只需将dup作为一个向量,而不是将它添加到数据帧中。