2017-09-19 1 views
3

J'ai essayé de trouver une solution simple au problème suivant. Voici l'exemple de travail minimum:Sous-ensemble d'une trame de données basée sur une condition logique sur un sous-ensemble de lignes

data <- data.frame(subject = c('Math', 'English', 'French', 'English'), 
        grade = c(1, 3, 5, 4)) 

Je veux une fonction qui compare les grades enlish et retourne un vecteur logique qui a TRUE pour la ligne avec le plus haut niveau anglais, et FAUX pour toutes les autres lignes. Dans ce cas [1] FALSE FALSE FALSE TRUE.

Merci pour votre aide.

Répondre

5

Nous pouvons obtenir le max « qualité » par « sujet » avec ave comparer avec la « qualité » pour obtenir un index logique et vérifier si le « sujet » est aussi « anglais »

with(data, ave(grade, subject, FUN = max)==grade & subject == "English") 
#[1] FALSE FALSE FALSE TRUE 
+1

Cela fonctionne parfaitement! Je n'ai pas compris les subtilités de ave() jusqu'à présent. – DocHoliday

2

aide une condition ifelse, une façon serait la suivante.

library(dplyr) 

data %>% 
mutate(check = if_else(subject == "English" & grade == max(grade[subject == "English"]), 
     TRUE, 
     FALSE)) 

# subject grade check 
#1 Math  1 FALSE 
#2 English  3 FALSE 
#3 French  5 FALSE 
#4 English  4 TRUE 
1

Une autre variation sur une solution en utilisant la commande ifelse():

data <- data.frame(subject = c('Math', 'English', 'French', 'English'), 
        grade = c(1, 3, 5, 4)) 

output <-ifelse(data[,1] == "English" & data[,2] == 4, TRUE, FALSE) 

> output 
[1] FALSE FALSE FALSE TRUE