2013-07-24 5 views
1

je suis à la recherche d'exécuter ddply sur un subsest de mes données, mais l'exemple ci-dessous retourne juste VRAI ou FAUXfonction application conditionnellement à l'aide ddply

ddply(demoData, .(name, id, gender == "Male"), summarize, tot = sum(count))

et

ddply(demoData[demoData$gender == 'Male'], .(name, id, gender), summarize, tot = sum(count))

doesn ne semble pas fonctionner non plus. finalement j'ai besoin de résumer "count" pour toutes les instances de gender = "Male" par nom et id.

échantillon de données demandé

id name gender  age  count 
1 apple Male  13-20  25 
1 apple Male  21-40  30 
1 apple Female 13-20  60 
1 apple Female 21-40  42 
2 banana Male  13-20  45 
2 banana Male  21-40  12 
2 banana Female 13-20  22 
2 banana Female 21-40  74 

ce que je veux revenir est

1 apple Male 55 
2 banana Male 57 
+0

Pouvez-vous poster un échantillon de vos données? – mnel

Répondre

3

base R de aggregate peut le faire très simplement:

aggregate(
      count ~ id + name + gender, 
      FUN=sum, 
      subset=gender=="Male", 
      data=demoData 
     ) 

Résultat:

id name gender count 
1 1 apple Male 55 
2 2 banana Male 57 

Et si vous devez absolument utiliser plyr parce que votre vie en dépend ou une autre raison, alors:

ddply(
    demoData[demoData$gender=="Male",], 
    .(id, name, gender), 
    summarise, 
    sumcount=sum(count) 
) 

Giving:

id name gender sumcount 
1 1 apple Male  55 
2 2 banana Male  57 
+0

si vous utilisez 'sous-ensemble (demoData, genre ==" Male ")' (que je trouve marginalement plus agréable que cette forme d'indexation, même si cela occasionne très occasionnellement des problèmes) je peux supprimer ma réponse ... –

+0

@BenBolker - J'évite toujours la fonction 'subset' de la crainte mentionnée de causer des problèmes involontaires. Est-ce acceptable de le changer dans ce contexte? – thelatemail

1

Même si ddply n'a pas intégré dans l'argumentation subset,

ddply(subset(demoData, gender=="Male"), 
    .(name, id), summarize, tot = sum(count)) 

semble fonctionner très bien ...

name id tot 
1 apple 1 55 
2 banana 2 57 

... même si elle n'a pas Male dans les résultats. Pour cela vous auriez besoin

ddply(subset(demoData, gender=="Male"), 
    .(name, id, gender), summarize, tot = sum(count)) 
Questions connexes