2016-09-06 1 views
1

Mes données ressemble à ceci:condition d'utilisation dans le cadre de données avec « avec » fonction R

manager  date country gender age q1 q2 q3 q4 q5 agecat 
1  1 10/24/08  US  M NA 5 4 5 5 5 NA 
2  2 10.28/08  US  F 45 3 5 2 5 5 NA 
3  3 10/1/08  UK  F NA 3 5 5 5 2 NA 
4  4 10/12/08  UK  M 39 3 3 4 NA NA NA 
5  5 5/1/09  UK  F 99 2 2 1 2 1 NA 

Maintenant, je suis en train de mettre agecat = « Elder » si l'âge> 55. J'ai essayé les deux jeux suivants des codes et a obtenu des résultats différents:

code 1 (travail)

leadership$agecat[leadership$age > 55] <- "Elder" 

code 2: (ne fonctionne pas)

with(leadership, { 
     agecat[age > 55] <- "Elder" 
    }) 

Quelqu'un peut-il m'aider à comprendre quelle est la différence entre les deux et pourquoi le second ne marche pas? Merci beaucoup!

+2

Regardez également la fonction 'cut()' si vous essayez de catégoriser une variable continue. – MrFlick

+1

... et n'oubliez pas lorsque vous utilisez 'within' pour attribuer les résultats à' leadership' ... ou essayez 'transform' ... –

Répondre

3

Tout d'abord, votre with expression

    { 
    agecat[age > 55] <- "Elder" 
} 

retourne invisiblement le résultat, et puisque vous ne l'avez pas affecté, il n'y a aucun changement partout. Il ya beaucoup de façons de le faire, et en utilisant with dans cette situation semble en fait un peu maladroit parce que vous auriez à faire ce qui suit. Notez que la colonne est renvoyée sur la deuxième ligne de l'expression.

leadership$agecat <- with(leadership, { 
    agecat[age > 55] <- "Elder" 
    agecat 
}) 

Pas vraiment un appel with simplifié, imo. Vous pouvez le nettoyer un peu avec

leadership$agecat <- with(leadership, replace(agecat, age > 55, "Elder")) 

qui est fondamentalement la même chose juste emballé dans une fonction. Mais vous pouvez également utiliser within, qui met à jour les données et vous les renvoie (nous aurions donc besoin d'assigner le résultat).

leadership <- within(leadership, agecat[age > 55] <- "Elder") 

Et comme les notes de @BenBolker, transform est une autre option. Cela renvoie également les données complètement mises à jour, comme within.

leadership <- transform(leadership,agecat = replace(agecat, age > 55, "Elder")) 

Longue histoire courte, il pourrait être préférable de coller avec votre code code pour cela.

+1

...' leadership <- transform (leadership, agecat = replace (agecat, age> 55, "Elder")) ' –

+0

Appréciez les différentes options fournies. tout a fonctionné. C'est une aide précieuse, et merci à tous pour les réponses !! – Crystal

1

with crée un environnement pour la trame de données de sorte que vous n'avez pas besoin de retaper le nom du bloc de données pour y accéder. Dans votre cas, vous avez créé une variable mais elle a disparu lorsque vous avez quitté l'environnement. Par conséquent, comme l'a dit Dirty Sock Sniffer, utilisez within qui crée également un environnement mais renvoie le bloc de données. Ainsi, les travaux suivants:

leadership <- within(leadership, agecat[age > 55] <- "Elder")