【问题标题】:Use R to reduce a dataset to only rows that have matching data in two separate columns [duplicate]使用 R 将数据集缩减为仅在两个单独的列中具有匹配数据的行 [重复]
【发布时间】:2018-05-18 12:26:46
【问题描述】:

我正在尝试将大量数据集减少为仅在“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 万行客户数据,因此我需要一种方法来识别可能的重复记录。

【问题讨论】:

  • 试试duplicated,即df[duplicated(df[2:3])|duplicated(df[2:3], fromLast = TRUE),]

标签: r bigdata


【解决方案1】:

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),]

【讨论】:

  • 我认为您的ifelse 可以简化为duplicated(df[,c('name','SSN')],fromLast=TRUE) | df$dup。如果您想加快速度,只需将dup 保留为向量,而不是将其添加到数据框中。
【解决方案2】:

或者,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

【讨论】:

    【解决方案3】:
    # Sample data
    df <- read.table(text = 
       "CUSTNUM FIRSTNAME SSN
        1234     Matt    111
        4321     Mark    222
        5678     Mike    333
        9875     Matt    444
        1092     Matt    111", sep = "", header = T);
    

    subsetting 基于pasted 列:

    subset(df, duplicated(paste(FIRSTNAME, SSN)) | duplicated(paste(FIRSTNAME, SSN), fromLast = T))
    #1    1234      Matt 111
    #5    1092      Matt 111
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-12
      • 1970-01-01
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多