代码之家  ›  专栏  ›  技术社区  ›  Nathan123

如何获得R中非唯一值的唯一键

r
  •  1
  • Nathan123  · 技术社区  · 5 年前

    我有以下数据框

    fileN<-c("510-1","510-1","510-2","510-2","510-3","510-3","510-3")
    disp<-c("account","fail","fail","fail","account","account","fail")
    
    df<-data.frame(fileN,disp)
    df
    
      fileN    disp
    1 510-1 account
    2 510-1    fail
    3 510-2    fail
    4 510-2    fail
    5 510-3 account
    6 510-3 account
    7 510-3    fail
    

    我想得到独一无二的 fileN 在那里 disp 两者都有 fail account

    我知道我可以做以下事情来得到 失败

    df %>%
      group_by(fileN) %>%
      filter( all(disp == 'fail')) %>%
      distinct
    

    但是我怎么才能得到 菲伦 两者兼而有之 失败 解释 所以期望的结果是

    510-1
    510-3
    
    2 回复  |  直到 5 年前
        1
  •  4
  •   akrun    5 年前

    选项将在按“filen”分组之后, filter 在哪里 all 所需的元素 vector 存在 %in% “disp”列,然后 ungroup 然后得到 distinct “filen”中的元素

    library(dplyr)
    df %>% 
      group_by(fileN) %>%
      filter(all(c('fail', 'account') %in% disp)) %>%
      ungroup %>%
      distinct(fileN)
    # A tibble: 2 x 1
    #  fileN
    #  <fct>
    #1 510-1
    #2 510-3
    

    如果这些是唯一可能的值,另一个选项是

    distinct(df) %>% 
        group_by(fileN) %>% 
        filter(n() == 2) %>% 
        distinct(fileN)
    
        2
  •  2
  •   d.b    5 年前

    几个R基选项

    v = tapply(df$disp, df$fileN, function(x){
        all(c("account", "fail") %in% x)
    })
    v[v]
    #510-1 510-3 
    # TRUE  TRUE 
    
    #OR
    
    with(aggregate(disp ~ fileN, df, function(x){
        all(c("account", "fail") %in% x)
    }), fileN[disp])
    #[1] 510-1 510-3
    #Levels: 510-1 510-2 510-3