【问题标题】:R: Find non-unique entires based on a variable [duplicate]R:根据变量查找非唯一的整体[重复]
【发布时间】:2024-01-18 23:24:01
【问题描述】:

我在表述这个权利时遇到了问题,如果您能进行任何编辑,我将不胜感激。 我有一个data frame,看起来像这样,显示各种卫星的操作员:

Operator Satellite
United   SAT1
American SAT2
United   SAT1
United   SAT3
American SAT3
American SAT5
Delta    SAT1
United   SAT8 

我正在尝试获取data frame,它为我提供了以下条目:对于由多个运营商运营的卫星,列出两个变量:

Operator Satellite
United   SAT1
United   SAT1
Delta    SAT1
United   SAT3
American SAT3

我能够映射此问题的唯一方法是使用which(file$operator) 循环,但这似乎是一种不必要的繁琐方法。

我会很感激任何帮助,并且不喜欢任何packages。提前谢谢你。

【问题讨论】:

    标签: r dataframe unique


    【解决方案1】:

    你可以试试dplyr解决方案:

    library(dplyr)
    
    df <- structure(list(Operator = c("United", "American", "United", "United", 
    "American", "American", "Delta", "United"), Satellite = c("SAT1", 
    "SAT2", "SAT1", "SAT3", "SAT3", "SAT5", "SAT1", "SAT8")), class = "data.frame", row.names = c(NA, 
    -8L))
    
    #Code
    df %>% left_join(df %>% group_by(Satellite) %>% summarise(N=n())) %>% filter(N>1)
    
      Operator Satellite N
    1   United      SAT1 3
    2   United      SAT1 3
    3   United      SAT3 2
    4 American      SAT3 2
    5    Delta      SAT1 3
    

    【讨论】:

    • 完美,这是一个很棒的 dplyr 解决方案。我很感激!
    • @questionmark 我希望它有所帮助。您应该接受更适合您的问题的答案:)
    【解决方案2】:

    这是data.table 单行方法

    library( data.table )
    DT <- fread("Operator Satellite
                United   SAT1
                American SAT2
                United   SAT1
                United   SAT3
                American SAT3
                American SAT5
                Delta    SAT1
                United   SAT8")
    
    
    DT[, if( .N > 1 ) .SD, by = Satellite]
    
    #    Satellite Operator
    # 1:      SAT1   United
    # 2:      SAT1   United
    # 3:      SAT1    Delta
    # 4:      SAT3   United
    # 5:      SAT3 American
    

    【讨论】:

    • 非常简单,感谢您的帮助!
    【解决方案3】:

    这是一种无需额外软件包的单行方法

    dw <- read.table(header=T, text='
    Operator Satellite
    United   SAT1
    American SAT2
    United   SAT1
    United   SAT3
    American SAT3
    American SAT5
    Delta    SAT1
    United   SAT8 
     ')
    
      dw[ave(dw$Satellite, dw$Satellite,  FUN = length) > 1,]
    
      Operator Satellite
    1   United      SAT1
    3   United      SAT1
    4   United      SAT3
    5 American      SAT3
    7    Delta      SAT1
    

    【讨论】:

    • 谢谢,这是一个非常巧妙的方法!
    最近更新 更多