0
votes

Réécrire A pour une boucle à un sappelisme en tenant compte de NA's

Je voudrais avoir r Calculer le Netincome pour une certaine quantité de revenu : xxx

maintenant, la taxe doit être calculé comme suit:

pour les cinq premières années (2001-2005), revenu <20 = 25%, revenu> 20 == 50%

pour les deuxième cinq ans ( 2006-2010), revenu <15 = 20%, revenu> 20 == 45%

J'ai essayé de l'écrire comme suit: xxx

mais Je reçois l'erreur: xxx

De plus, j'aimerais vraiment réécrire ceci de manière plus propre avec sapply mais je me débattre avec comment.


1 commentaires

Sapply perd l'avantage de la vectorisation. Tous vos calculs sont sur des vecteurs.


3 Réponses :


2
votes
library(dplyr)
DT[Income < 0,Income:= NA] # better use this construction
DT[,.(netincome = case_when(Income < 20 & year < 2006 ~ Income - 0.25 * Income,
                            Income > 20 & year < 2006 ~ Income - 20 * 0.25 - 0.5 * (Income - 20),
                            Income < 15 & year > 2005 ~ Income - 0.2 * Income,
                            Income > 15 & year > 2005 ~ Income - 15*0.2 - 0.45 * (Income - 15)))]
This would be much easier if you use consistent column name (best practice tolower). And try not to use names like DT. DT stands for one of a well used package in R, and it's a bit confusing. And in future version of data.table there would be an fcase, which faster then case_when

0 commentaires

0
votes
library(dplyr)
DT%>%
  mutate(netincome = case_when(Income < 20 & year < 2006 ~ Income - 0.25 * Income,
                               Income > 20 & year < 2006 ~ Income - 20*0.25 - 0.5*(Income-20),
                               Income < 15 & year > 2005 ~ Income -0.2*Income,
                               Income > 15 & year > 2005 ~ Income - 15*0.2 - 0.45*(Income-15))
If you like dplyr approach :), you also can use %<>% this operator. Or if you don't want new column you may switch to summarize

2 commentaires

Veuillez combiner vos réponses en une seule fois, sauf si vous pensez qu'il est vraiment nécessaire de faire en deux distincts


HM, je pense qu'il serait préférable de séparer les données data.table et dplyr.



2
votes

Si vous voulez le faire dans la base R, vous n'avez pas besoin d'utiliser sapply code>; Vous pouvez simplement nier quelques déclarations ifelse code>. XXX PRE>

Résumé de la colonne résultante. Est-ce que cela correspond à votre sortie attendue? P>

> summary(DT$netincome)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
  4.372   4.710  11.053  11.614  14.881  27.076      20 


0 commentaires