J'ai le jeu de données suivant:

clubs <- c("AZ","AZ","AZ","AZ")
won <- c("W","L","W","L")
last_match <- c("NA", "NA", "NA","NA")

df_new <- data.frame(clubs, won, last_match)

Ce que je voudrais faire maintenant, c'est:

  • lire dans le csv
  • aller chercher la 2e jusqu'à la fin des rangées
  • voir si le dernier match est gagné

Le code ci-dessous fonctionne bien:

calc <- function(){

  setwd("...")
  df_new <- read.csv2("df_club.csv", header = T)

  #checking
  print(head(df_new))

  for(i in 2:nrow(df_new)){

   df_new$last_match[i] <-  df_new$won[i-1]
  }

  #checking
  print(head(df_new))

}

Pour des raisons de vue d'ensemble, je voudrais cependant placer la partie calculer dans une fonction différente. Alors c'est pourquoi j'ai essayé ceci:

 #define calculating formule
 calculate_last_win <- function(df){

  for(i in 2:nrow(df_new)){

   df_new$last_match[i] <-  df_new$won[i-1]
  }
  return(df)
 }


#normal function

calc <- function(){

  setwd("...")
  df_new <- read.csv2("df_club.csv", header = T)

  #checking
  print(head(df_new))

  calculate_last_win(df_new)

  #checking
  print(head(df_new))

 }

Mais alors ma sortie ne change pas. Des pensées sur ce qui ne va pas?

r
0
Frank Gerritsen 22 déc. 2015 à 20:26

2 réponses

Meilleure réponse

Dans calc, remplacez la ligne calculate_last_win(df_new) par df_new <- calculate_last_win(df_new), et dans la fonction calculate_last_win, remplacez df_new par df.

clubs <- c("AZ","AZ","AZ","AZ")
won <- c("W","L","W","L")

dfNew <-data.frame(clubs, won)


#define calculating formule
calculate_last_win <- function(df){

  for(i in 2:nrow(df)){

    df[i,"last_match"] <-  df[i-1,"won"]
  }
  return(df)
}


#normal function

calc <- function(){

  setwd("...")
  df_new <- dfNew

  #checking
  print(head(df_new))

  df_new <- calculate_last_win(df_new)

  #checking
  print(head(df_new))

  return ( df_new )
}

.

> calc()
  clubs won
1    AZ   W
2    AZ   L
3    AZ   W
4    AZ   L
  clubs won last_match
1    AZ   W       <NA>
2    AZ   L          W
3    AZ   W          L
4    AZ   L          W
  clubs won last_match
1    AZ   W       <NA>
2    AZ   L          W
3    AZ   W          L
4    AZ   L          W
0
mra68 22 déc. 2015 à 18:23

Je pense que votre fonction devrait ressembler à ceci. La fonction a besoin de df_new pour être df.

calculate_last_win <- function(df){

  for(i in 2:nrow(df)){

   df$last_match[i] <-  df$won[i-1]
  }
  return(df)
 }

Je vérifierais également que return(df) remplace df_new après l'appel de la fonction.

0
TBSRounder 22 déc. 2015 à 17:45