web-dev-qa-db-fra.com

Sous-ensemble d'une trame de données par plusieurs niveaux de facteur

Comment éviter d'utiliser une boucle pour sous-définir une trame de données en fonction de plusieurs niveaux de facteurs?

Dans l'exemple suivant, ma sortie souhaitée est une trame de données. La trame de données doit contenir les lignes de la trame de données d'origine où la valeur dans "Code" est égale à l'une des valeurs dans "sélectionné".

Exemple de travail:

#sample data
Code<-c("A","B","C","D","C","D","A","A")
Value<-c(1, 2, 3, 4, 1, 2, 3, 4)
data<-data.frame(cbind(Code, Value))

selected<-c("A","B") #want rows that contain A and B

#Begin subsetting
result<-data[which(data$Code==selected[1]),]
s1<-2
while(s1<length(selected)+1)
{
  result<-rbind(result,data[which(data$Code==selected[s1]),])
  s1<-s1+1
}

Il s'agit d'un exemple jouet d'un ensemble de données beaucoup plus grand, donc "sélectionné" peut contenir un grand nombre d'éléments et les données un grand nombre de lignes. Je voudrais donc éviter la boucle.

18
Walter

Vous pouvez utiliser %in%

  data[data$Code %in% selected,]
  Code Value
1    A     1
2    B     2
7    A     3
8    A     4
33
Metrics

Essaye ça:

> data[match(as.character(data$Code), selected, nomatch = FALSE), ]
    Code Value
1      A     1
2      B     2
1.1    A     1
1.2    A     1
4
Jilber Urbina

En voici une autre:

data[data$Code == "A" | data$Code == "B", ]

Il convient également de mentionner que le facteur de sous-ensemble n'a pas à faire partie du bloc de données s'il correspond aux lignes du bloc de données en longueur et en ordre. Dans ce cas, nous avons quand même créé notre base de données à partir de ce facteur. Alors,

data[Code == "A" | Code == "B", ]

fonctionne également, ce qui est l'une des choses vraiment utiles à propos de R.

4
Joe