【问题标题】:remove rows with same id but different value in another column in r删除r中另一列中具有相同id但值不同的行
【发布时间】:2018-08-09 17:49:58
【问题描述】:

我有一个如下的数据框:

id = c("a2887", "a2887", "a5511","a5511","a2806", "a1491", "a1491", "a4309", "a4309") 
plan = c("6V", "6V", "25HS", "50HS", "25HS", "250Mbps", "250Mbps", "15Mbps", "15Mbps") 
df = data.frame(id, plan)

看起来像:

   id    plan 
a2887      6V
a2887      6V
a5511    25HS
a5511    50HS
a2806    25HS
a1491 250Mbps
a1491 250Mbps
a4309  15Mbps
a4309  15Mbps

我想在列计划中删除具有相同 ID 但具有不同值的行,只保留具有唯一 ID/计划匹配的行并创建一个新的数据框,如下所示:

   id    plan
a2887      6V
a2806    25HS
a1491 250Mbps
a4309  15Mbps

有什么优雅的方法可以实现这一点吗? 谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以使用tidyverse。按 'id' 分组后,filter 'id' 组对于 'plan' 只有一个唯一值,并得到 distinct

    library(dplyr)
    df %>%
       group_by(id) %>%
       filter(n_distinct(plan)==1) %>%
       distinct()
    # A tibble: 4 x 2
    # Groups: id [4]
    #  id     plan   
    #  <fctr> <fctr> 
    #1 a2887  6V     
    #2 a2806  25HS   
    #3 a1491  250Mbps
    #4 a4309  15Mbps 
    

    【讨论】:

    • 这太棒了。感谢分享!
    【解决方案2】:

    data.table解决方案:

    library(data.table)
    setDT(df)
    df <- unique(df)
    df[, idx := .N, by = id]
    df <- df[!(idx > 1), ]
    df[, idx := NULL]
    
         id    plan
    1: a2887      6V
    2: a2806    25HS
    3: a1491 250Mbps
    4: a4309  15Mbps
    

    【讨论】:

      【解决方案3】:

      基础 R 解决方案:

      # split df into different groups by id after removing duplicates
      df <- unique(df)
      df <- split(df, df$id)
      
      # keep those 'groups' with only a single row
      df <- df[sapply(df, nrow) == 1]
      
      # bind rows together
      df <- do.call(rbind, df)
      

      【讨论】:

      • @Gregor 你是对的。我对其进行了编辑以删除重复项。
      猜你喜欢
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      • 1970-01-01
      • 2017-01-27
      • 2017-12-31
      • 1970-01-01
      • 2019-05-31
      相关资源
      最近更新 更多