2017-08-15 1 views
1

J'ai une simple table de concordance correcte (dataframe dans R) des États et des codes d'état:lignes Isoler dans un dataframe dont les niveaux facteur dans deux colonnes ne correspondent pas à ceux de deux colonnes d'une autre dataframe

statecodeconcordance<-structure(list(State.Code = structure(1:5, .Label = 
c("1", "2", "3", "4", "5"), class = "factor"), State.Name = structure(1:5, 
.Label = c("Alabama", "Alaska", "Arizona", "Arkansas", "California"), class 
= "factor")), .Names = c("State.Code", "State.Name"), row.names = c(NA, 
-5L), class = c("data.table", "data.frame")) 

qui ressemble à ceci:

State.Code State.Name 
1   1 Alabama 
2   2  Alaska 
3   3 Arizona 
4   4 Arkansas 
5   5 California 

et j'ai un dataframe contenant des erreurs, dans laquelle certains Etats se voient attribuer le mauvais code d'état (plus diverses colonnes non liées):

sampledata<-structure(list(State.Code = structure(c(1L, 2L, 1L, 1L, 1L, 2L, 
4L, 3L, 1L, 4L), .Label = c("1", "2", "3", "5"), class = "factor"), 
State.Name = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 3L, 3L, 4L, 4L), .Label = 
c("Alabama", "Alaska", "Arizona", "California"), class = "factor"), 
Unrelated.Data = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L), 
.Label = c("some_data", "more_data", "other_data", "data_squared", 
"alternate_data", "yet_more_data", "so_much_data", 
"running_out_of_modifiers_for_data", "still_more_data", "last_data"), class 
= "factor")), .Names = c("State.Code", "State.Name", "Unrelated.Data"), 
class = "data.frame", row.names = c(NA, -10L)) 

qui ressemble à ceci:

State.Code State.Name     Unrelated.Data 
1   1 Alabama       some_data 
2   2 Alabama       more_data 
3   1 Alabama      other_data 
4   1 Alabama      data_squared 
5   1 Alabama     alternate_data 
6   2  Alaska      yet_more_data 
7   5 Arizona      so_much_data 
8   3 Arizona running_out_of_modifiers_for_data 
9   1 California     still_more_data 
10   5 California       last_data 

Comment puis-je sous-ensemble cette dernière dataframe pour renvoyer uniquement les lignes dans lesquelles les paires état-code ne correspondent pas aux paires dans la table de concordance (soit les lignes avec Alabama dans State.Name mais un numéro non 1 dans State.Code, Alaska dans State.Name mais un numéro non 2 dans State.Code, etc.)?

sortie Idéal:

State.Code State.Name     Unrelated.Data 
2   2 Alabama       more_data 
7   5 Arizona      so_much_data 
9   1 California     still_more_data 

Répondre

3

Vous pouvez utiliser dplyr package:

library(dplyr) 
anti_join(sampledata, statecodeconcordance, by = c("State.Code","State.Name")) 

# State.Code State.Name Unrelated.Data 
# 1   5 Arizona so_much_data 
# 2   2 Alabama  more_data 
# 3   1 California still_more_data 
2

Nous pouvons utiliser le package data.table.

library(data.table) 

setDT(sampledata) 
setDT(statecodeconcordance) 

sampledata[!statecodeconcordance, on = c("State.Code", "State.Name")] 
    State.Code State.Name Unrelated.Data 
1:   2 Alabama  more_data 
2:   5 Arizona so_much_data 
3:   1 California still_more_data