2012-08-16 3 views
1

Disons que j'ai 2 listessapply 2 vecteurs

divisor = c(0, 1, 1, 7, 7, 8, 8, 8, 9) 
remainder = c(99, 0, 1, 1, 99, 0, 1, 99, 0) 

Je veux un diviseur élément être élément + 1 si son reste correspondant est différent de 0. La réponse finale devrait ressembler à:

updated.divisor = (1, 1, 2, 8, 8, 8, 9, 9, 9) 

Comment le faire en utilisant sapply?

Jusqu'à présent, j'ai

sapply(remainder, function(x) { 
    if x != 0{ 
     #divisor = divisor + 1 
    } 
    else{ 
     #divisor = divisor + 0 
    } 
} 

post-scriptum Je pourrais probablement utiliser une boucle imbriquée, mais je veux être en mesure de le faire en utilisant sapply.

+1

Votre résultat spécifié nécessitait un PAS dans la description. –

+0

merci pour l'édition DWin – Paolo

Répondre

4

à votre commentaire: Si vous vouliez une appliquer la solution de type que vous utilisez mapply car il vous permet de traiter deux arguments « aux côtés de l'autre »:

mapply(function(x,y) {x + !(y==0)}, x=divisor, y=remainder) 
#[1] 1 1 2 8 8 8 9 9 9 

Une solution ifelse serait logique aussi:

ifelse(remainder !=0, divisor+1, divisor) 
#[1] 1 1 2 8 8 8 9 9 9 
9

Vous n'avez pas besoin d'une boucle:

divisor + (remainder!=0) 
[1] 1 1 2 8 8 8 9 9 9 

C'est l'un des principes les plus fondamentaux de R: toutes les opérations de base (et de nombreuses fonctions) acceptent des vecteurs en entrée et effectuer l'opération sur tous les éléments de ce vecteur en même temps.

+0

Je ne savais pas cela, merci pour l'enseignement de moi quelque chose de nouveau. Si je devais utiliser du sapply, comment ferais-je cela? – Paolo

+0

@ user1342697 Vous n'utiliserez pas 'sapply' sur cet exemple. Ce serait juste une mauvaise idée. Si vous avez un autre problème où vous pensez que "spply" est la bonne chose à faire, alors je vous suggère de poster une nouvelle question. – Andrie