2 votes

Passer le data.frame comme argument dans une fonction

Contexte

En tant que suivi de R : Passer un data.frame par référence à une fonction et Comment ajouter une colonne dans le data frame à l'intérieur d'une fonction

Je tente la fonction suivante, apparemment simple :

naToZero <- function(df) { df$Vol[is.na(df$Vol)] <- 0 }

Data.frame

> str(WFM)
Classes ‘tbl_df’, ‘tbl’ et 'data.frame':   990571 obs. de  14 variables:
 $ Date      : chr  "04/12/2017" "04/12/2017" "04/12/2017" "04/12/2017" ...
 $ Time      :Classes 'hms', 'difftime'  atomic [1:990571] 41970 41969 41968 41967 41966 ...
  .. ..- attr(*, "units")= chr "secs"
 $ Bar#      : chr  "197953/197953" NA "197952/197953" NA ...
 $ Bar Index : int  0 NA -1 NA NA -2 NA NA -3 NA ...
 $ Tick Range: int  0 NA 0 NA NA 0 NA NA 0 NA ...
 $ Open      : num  33.9 NA 33.9 NA NA ...
 $ High      : num  33.9 NA 33.9 NA NA ...
 $ Low       : num  33.9 NA 33.9 NA NA ...
 $ Close     : num  33.9 NA 33.9 NA NA ...
 $ Vol       : int  100 NA 200 NA NA 100 NA NA 400 NA ...
 $ MACDHist  : num  -59 NA -87 NA NA ...
 $ MACD      : num  -450 NA -445 NA NA ...
 $ MACDSig   : num  -391 NA -358 NA NA ...
 $ ZScore1   : num  NA NA NA NA NA NA NA NA NA NA ...

En espérant utiliser cette fonction pour accélérer le nettoyage des données.

Problème

Après avoir exécuté la fonction dans l'éditeur de script, et avoir passé un data.frame pour l'exécuter. Mais la fonction ne fait rien et quand je fais Voir(WFM), c'est toujours les mêmes vieilles données. Cependant, quand j'exécute manuellement la commande :

WFM$Vol[is.na(WFM$Vol)] <- 0

Alors ça marche.

Choses que j'ai essayées

J'ai essayé d'expérimenter en me basant sur les deux liens que j'ai vus, qui semblent pertinents :

En utilisant WFM <- naToZero(WFM), produit un vecteur avec une seule valeur, 0.

Essayé en utilisant WFM <- data.table(WFM) et en exécutant la fonction... même chose.

Je dois manquer quelque chose de fondamental.

4voto

Konrad Rudolph Points 231505

Pratiquement tous les objets en R sont immuables : les opérations ne modifient pas l'original, elles en créent une copie. Vous devez donc attribuer cette copie à l'original.

<- le fait, mais il attribue à df à l'intérieur de votre fonction, qui est une copie de l'argument (= WFM) que vous passez à votre fonction.

Vous devez donc modifier votre fonction :

naToZero <- function(df) {
    df$Vol[is.na(df$Vol)] <- 0
    df
}

… et comment vous l'appelez :

WFM = naToZero(WFM)

1voto

akrun Points 148302

Nous pouvons rendre cela plus dynamique en utilisant la version de développement de dplyr (bientôt disponible 0.6.0)

library(tidyverse)
naToZero <- function(df, Col) {
    Col <- enquo(Col)
    ColN <- quo_name(Col)
     df %>% 
      mutate(!!ColN := replace(!!Col, is.na(!!Col), 0))

}

naToZero(WFM, Vol)
# A tibble: 3 × 2
#       Date   Vol
#       
#1 04/12/2017     0
#2 04/12/2017    23
#3 04/12/2017    40

Ou pour d'autres colonnes

naToZero(WFM, Open)
# A tibble: 3 × 3
#       Date   Vol  Open
#         
#1 04/12/2017    NA  33.9
#2 04/12/2017    23   0.0
#3 04/12/2017    40  32.0

La fonction enquo a une fonctionnalité similaire à substitute de base R en prenant les arguments d'entrée et en les convertissant en quosure. Dans le mutate, nous pouvons déquoter (!! or UQ) pour évaluer les colonnes ainsi que les chaînes de caractères à gauche créées avec quo_name

data

WFM <- tibble(Date = rep("04/12/2017", 3), Vol = c(NA, 23, 40), Open = c(33.9, NA, 32))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X