R: Remplacer les multiples valeurs de plusieurs colonnes de dataframes avec NA

Je suis en train de réaliser quelque chose de similaire à cette question mais avec plusieurs valeurs qui doivent être remplacés par de NA, et dans le grand jeu de données.

df <- data.frame(name = rep(letters[1:3], each = 3), foo=rep(1:9),var1 = rep(1:9), var2 = rep(3:5, each = 3))

qui génère cette dataframe:

df
  name foo var1 var2
1    a   1    1    3
2    a   2    2    3
3    a   3    3    3
4    b   4    4    4
5    b   5    5    4
6    b   6    6    4
7    c   7    7    5
8    c   8    8    5
9    c   9    9    5

Je voudrais remplacer toutes les occurrences de, disons, 3 et 4 par NA, mais seulement dans les colonnes qui commencent par "var".

Je sais que je peux utiliser une combinaison de [] opérateurs pour obtenir le résultat que je veux:

df[,grep("^var[:alnum:]?",colnames(df))][ 
        df[,grep("^var[:alnum:]?",colnames(df))] == 3 |
        df[,grep("^var[:alnum:]?",colnames(df))] == 4
   ] <- NA

df
  name foo var1 var2
1    a   1    1    NA
2    a   2    2    NA
3    a   3    NA   NA
4    b   4    NA   NA
5    b   5    5    NA
6    b   6    6    NA
7    c   7    7    5
8    c   8    8    5
9    c   9    9    5

Maintenant mes questions sont les suivantes:

  1. Est-il un moyen de le faire de manière efficace, étant donné que mon réel
    jeu de données d'environ 100.000 lignes, et de 400 à 500 variables commencent
    avec "var". Il me semble (subjectivement) lent sur mon ordinateur lorsque j'utilise
    les deux crochets de la technique.
  2. Comment pourrais-je aborder le problème si
    au lieu de 2 valeurs (3 et 4) pour être remplacé par NA, j'ai eu une longue
    liste de, disons, 100 valeurs différentes? Est-il un moyen de spécifier plusieurs valeurs avec le fait de devoir faire un maladroit série de conditions séparés par | opérateur?
Vous pouvez utiliser %in%.

OriginalL'auteur Peutch | 2014-09-10