1

I am having trouble phrasing this right and would appreciate any editing. I have a data frame that looks something like this, showing operators of various satellites:

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

I am trying to get a data frame that gives me the entries where, for satellites that were operators by more than one operator, listing both variables:

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

The only way I've been able to map this problem is to use a which(file$operator) loop, but that seems like an unnecessarily cumbersome approach.

I'd appreciate any help and don't have a preference for any packages. Thank you in advance.

questionmark
  • 335
  • 1
  • 13

3 Answers3

3

You can try dplyr solution:

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
Duck
  • 39,058
  • 13
  • 42
  • 84
2

Here is a data.table one-line approach

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
Wimpel
  • 26,031
  • 1
  • 20
  • 37
1

Here's a one line approach with no additional packages

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
greengrass62
  • 968
  • 7
  • 19