【问题标题】:combine two rows in R merging data and remove duplicates在 R 合并数据中合并两行并删除重复项
【发布时间】:2018-06-09 13:58:34
【问题描述】:

我正在清理包含电子邮件及其各自信息的数据库。有些电子邮件出现不止一次,但从一行到另一行的信息是互补的。所以我想使用电子邮件作为键来组合行。并在信息重复的情况下删除电子邮件。

我的数据库是一个 csv 文件,并使用 read.csv 将其转换为数据框。

输入

  EMAIL     Country     Gender        Language
1 y@y.com   US                           S
2 z@z.com   AR           female          S
3 z@z.com                female          
4 s@f.com   US           female          E
4 s@f.com   US           female          E
5 y@y.com   US           male

输出

  EMAIL     Country     Gender        Language
1 y@y.com   US           male            S
2 z@z.com   AR           female          S
3 s@f.com   US           female          E

【问题讨论】:

    标签: r database csv data-cleaning


    【解决方案1】:

    我们也可以使用aggregate 作为基本 R 选项:

    df_out <- aggregate(x=df, by=list(df$EMAIL), function(x) { max(x, na.rm=TRUE) })
    df_out[order(df_out$EMAIL), -1]
    
        EMAIL Country Gender Language
    1 s@f.com      US female        E
    2 y@y.com      US   male        S
    3 z@z.com      AR female        S
    

    这里的基本思想是,对于每个电子邮件键,我们任意取每列的最大值,而忽略 NA 值。这似乎适用于您的数据集。

    数据:

    df <- data.frame(EMAIL=c('y@y.com', 'z@z.com', 'z@z.com', 's@f.com', 's@f.com', 'y@y.com'),
                     Country=c('US', 'AR', NA, 'US', 'US', 'US'),
                     Gender=c(NA, 'female', 'female', 'female', 'female', 'male'),
                     Language=c('S', 'S', NA, 'E', 'E', NA), stringsAsFactors=FALSE)
    

    Demo

    【讨论】:

    • 当一个字段对于电子邮件键的全部为 NA 时,这将失败。
    【解决方案2】:

    我们可以使用dplyr。按“EMAIL”分组后,使用summarise_all获取非空白列的unique元素

    library(dplyr)
    df %>%
       group_by(EMAIL) %>%
       summarise_all(funs(unique(.[.!='']))) 
    # A tibble: 3 x 4
    # Groups: EMAIL [3]
    #  EMAIL   Country Gender Language
    #  <chr>   <chr>   <chr>  <chr>   
    #1 y@y.com US      male   S       
    #2 z@z.com AR      female S       
    #3 s@f.com US      female E
    

    数据

    df <- structure(list(EMAIL = c("y@y.com", "z@z.com", "z@z.com", "s@f.com", 
    "s@f.com", "y@y.com"), Country = c("US", "AR", "", "US", "US", 
    "US"), Gender = c("", "female", "female", "female", "female", 
    "male"), Language = c("S", "S", "", "E", "E", "")), .Names = c("EMAIL", 
     "Country", "Gender", "Language"), class = "data.frame", row.names = c("1", 
    "2", "3", "4", "5", "6"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      • 2011-11-18
      • 2017-06-22
      • 1970-01-01
      • 2010-12-07
      相关资源
      最近更新 更多