Renvoyer un élément d'une colonne correspondant à la ligne d'un autre élément

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Helene Charpentier
Messages : 13
Enregistré le : 04 Mar 2019, 16:09

Re: Renvoyer un élément d'une colonne correspondant à la ligne d'un autre élément

Messagepar Helene Charpentier » 08 Mar 2019, 15:40

Merci beaucoup Mickael ! Ça a dû vous prendre un temps fou !
Je n'ai pas encore tout compris à la première lecture mais je vais prendre le temps de bien lire tout ça et l'appliquer.

Cordialement,

[EDIT] Maxime, j'ai reçu ton message pendant que je rédigeais, et ça là je comprends :

Ensuite quand tu tapes base1$col1 dans le corps de ta fonction, col1 ne va pas être remplacé par le nom de ta colonne que tu lui aura donné. Il va chercher la colonne qui s'appelle 'col1' dans base1. Comme il n'y a pas de colonne "col1" dans base1 il ne peut pas trouver les données et donc il ne peut pas faire le boxplot d'où le message d'erreur d'avant. Par contre si tu fais base1[, col1] alors la col1 va correspondre à l'objet col1 et il va se servir de la valeur contenu dans cet objet.


D'ailleurs, j'ai essayé comme on le voit dans ce passage (à lire avec cette musique en fond : https://www.youtube.com/watch?v=ZnHmskwqCCQ )

Code : Tout sélectionner

aberr <- function(x) {
  moust <- ChocsEtCO2_Base$x[1]
+ return(moust)
}
aberr(ChocsEtCO2_Base$CO2)

ChocsEtCO2_Base$Pays[1]

ChocsEtCO2_Base[2,"Pays"]
ChocsEtCO2_Base[2,]
ChocsEtCO2_Base[,3]
ChocsEtCO2_Base["Pays",]
ChocsEtCO2_Base$Pays


Allez, je vais faire tourner la machine (celle située au-dessus de mes épaules), pour réussir à faire tourner mon programme !
Je vous tiens au courant (en espérant que c'est pour vous dire que ça marche bien :) )

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Renvoyer un élément d'une colonne correspondant à la ligne d'un autre élément

Messagepar Mickael Canouil » 08 Mar 2019, 15:56

Je vous suggère de lire ma réponse et relire celle de Maxime
En effet, votre code ne peut pas "bien" fonctionner dans l'état pour des raisons déjà évoquées.

A toutes fins utiles, le package reprex et la fonction reprex de ce package est très pratique pour ne pas passer "un temps fou" à générer un exemple de code reproductible

Code : Tout sélectionner

reprex::reprex({
 
  library(dplyr)
  set.seed(08032019)
  ChocsEtCO2_Base <- dplyr::tibble(
    Pays = rep(LETTERS, each = 10),
    CO2 = rnorm(length(Pays))
  )
  ChocsEtCO2_Base
 
 
  aberr <- function(x) {
    moust <- ChocsEtCO2_Base$x[1]
    return(moust)
  }
  aberr(ChocsEtCO2_Base$CO2)
 
  ChocsEtCO2_Base$Pays[1]
 
  ChocsEtCO2_Base[2,"Pays"]
  ChocsEtCO2_Base[2,]
  ChocsEtCO2_Base[,3]
  ChocsEtCO2_Base["Pays",]
  ChocsEtCO2_Base$Pays
 
})


``` r

library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
set.seed(08032019)
ChocsEtCO2_Base <- dplyr::tibble(
Pays = rep(LETTERS, each = 10),
CO2 = rnorm(length(Pays))
)
ChocsEtCO2_Base
#> # A tibble: 260 x 2
#> Pays CO2
#> <chr> <dbl>
#> 1 A 1.05
#> 2 A 0.888
#> 3 A -0.460
#> 4 A -0.217
#> 5 A -0.961
#> 6 A -0.0877
#> 7 A 0.593
#> 8 A 1.02
#> 9 A -0.0509
#> 10 A -1.92
#> # … with 250 more rows


aberr <- function(x) {
moust <- ChocsEtCO2_Base$x[1]
return(moust)
}
aberr(ChocsEtCO2_Base$CO2)
#> Warning: Unknown or uninitialised column: 'x'.
#> NULL

ChocsEtCO2_Base$Pays[1]
#> [1] "A"

ChocsEtCO2_Base[2,"Pays"]
#> # A tibble: 1 x 1
#> Pays
#> <chr>
#> 1 A
ChocsEtCO2_Base[2,]
#> # A tibble: 1 x 2
#> Pays CO2
#> <chr> <dbl>
#> 1 A 0.888
ChocsEtCO2_Base[,3]
#> Error: Positive column indexes in `[` must match number of columns:
#> * `.data` has 2 columns
#> * Position 1 equals 3
ChocsEtCO2_Base["Pays",]
#> # A tibble: 1 x 2
#> Pays CO2
#> <chr> <dbl>
#> 1 <NA> NA
ChocsEtCO2_Base$Pays
#> [1] "A" "A" "A" "A" "A" "A" "A" "A" "A" "A" "B" "B" "B" "B" "B" "B" "B"
#> [18] "B" "B" "B" "C" "C" "C" "C" "C" "C" "C" "C" "C" "C" "D" "D" "D" "D"
#> [35] "D" "D" "D" "D" "D" "D" "E" "E" "E" "E" "E" "E" "E" "E" "E" "E" "F"
#> [52] "F" "F" "F" "F" "F" "F" "F" "F" "F" "G" "G" "G" "G" "G" "G" "G" "G"
#> [69] "G" "G" "H" "H" "H" "H" "H" "H" "H" "H" "H" "H" "I" "I" "I" "I" "I"
#> [86] "I" "I" "I" "I" "I" "J" "J" "J" "J" "J" "J" "J" "J" "J" "J" "K" "K"
#> [103] "K" "K" "K" "K" "K" "K" "K" "K" "L" "L" "L" "L" "L" "L" "L" "L" "L"
#> [120] "L" "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "N" "N" "N" "N" "N" "N"
#> [137] "N" "N" "N" "N" "O" "O" "O" "O" "O" "O" "O" "O" "O" "O" "P" "P" "P"
#> [154] "P" "P" "P" "P" "P" "P" "P" "Q" "Q" "Q" "Q" "Q" "Q" "Q" "Q" "Q" "Q"
#> [171] "R" "R" "R" "R" "R" "R" "R" "R" "R" "R" "S" "S" "S" "S" "S" "S" "S"
#> [188] "S" "S" "S" "T" "T" "T" "T" "T" "T" "T" "T" "T" "T" "U" "U" "U" "U"
#> [205] "U" "U" "U" "U" "U" "U" "V" "V" "V" "V" "V" "V" "V" "V" "V" "V" "W"
#> [222] "W" "W" "W" "W" "W" "W" "W" "W" "W" "X" "X" "X" "X" "X" "X" "X" "X"
#> [239] "X" "X" "Y" "Y" "Y" "Y" "Y" "Y" "Y" "Y" "Y" "Y" "Z" "Z" "Z" "Z" "Z"
#> [256] "Z" "Z" "Z" "Z" "Z"
```

<sup>Created on 2019-03-08 by the [reprex package](https://reprex.tidyverse.org) (v0.2.1)</sup>
Mickaël
mickael.canouil.fr | rlille.fr

Helene Charpentier
Messages : 13
Enregistré le : 04 Mar 2019, 16:09

Re: Renvoyer un élément d'une colonne correspondant à la ligne d'un autre élément

Messagepar Helene Charpentier » 08 Mar 2019, 17:49

Mickael Canouil a écrit :
2/ Créons maintenant les variables "CO2" et "abCO2" que vous utilisez

Code : Tout sélectionner

# Création d'un seuil pour exclure/inclure que certaines valeurs
exclusion_threshold <- median(ChocsEtCO2_Base0[["CO2"]]) + 1.5 * IQR(ChocsEtCO2_Base0[["CO2"]])

# Récupération des "bonnes" valeurs de la variable "CO2" que nous stockons dans "abCO2"
abCO2 <- ChocsEtCO2_Base0[["CO2"]][ChocsEtCO2_Base0[["CO2"]] <= exclusion_threshold]



Je ne comprends pas pourquoi la fonction boxplot n'est pas utilisée ; je comprends bien qu'une boîte à moustaches, c'est (médiane +/- 1.57 * (Q3-Q1)/racine(N)) mais pourquoi est-ce qu'on ne peut pas directement utiliser boxplot comme dans

Code : Tout sélectionner

bCO2 <- boxplot(ChocsEtCO2_Base$CO2,col="grey",main="Intensité Carbone")
abCO2 <- bCO2$out

?

En plus, dans boxplot et $out, on a ensuite les valeurs de part et d'autre des moustaches ; avec le seuil on a juste un seuil, pas un intervalle (mais encore, ça je peux sûrement trouver).

Je me demande juste pourquoi on ne peut pas utiliser une fonction boxplot et ensuite $out, qui sont super pratiques pour ça.

Helene Charpentier
Messages : 13
Enregistré le : 04 Mar 2019, 16:09

Re: Renvoyer un élément d'une colonne correspondant à la ligne d'un autre élément

Messagepar Helene Charpentier » 08 Mar 2019, 17:54

Mickael Canouil a écrit :
en ajoutant un argument "data" et en imposant à "n" d'être le nom de la colonne (que l'on récupérera via "get()")

Code : Tout sélectionner

interpr_1 <- function(n, p, data) {
  res1 <- dplyr::filter(.data = data, get(n) %in% p)
  res2 <- dplyr::group_by(.data = res1, Pays)
  res3 <- dplyr::summarise(res2, mean(get(n)), min(get(n)), max(get(n)))
  return(res3)
}




Aaaaahhh c'est donc LÀ qu'il faut le mettre ce fameux "DATA" !!
Je pense que j'ai plus de problèmes avec la syntaxe qu'avec la compréhension à proprement parler : pourquoi "(n, p, data)" et pas "(data=n, p)" par exemple ? Pourquoi un point devant data dans "dplyr::filter(.data = data, get(n) %in% p)", etc...
(Le bonheur de découvrir un langage, et ses spécificités syntaxiques grrblblblblblbl.)

Merci beaucoup !

Helene Charpentier
Messages : 13
Enregistré le : 04 Mar 2019, 16:09

Re: Renvoyer un élément d'une colonne correspondant à la ligne d'un autre élément

Messagepar Helene Charpentier » 09 Mar 2019, 06:24

Mickael Canouil a écrit :

Code : Tout sélectionner

library(tidyverse)
set.seed(08032019)



Pourquoi ?

Helene Charpentier
Messages : 13
Enregistré le : 04 Mar 2019, 16:09

Re: Renvoyer un élément d'une colonne correspondant à la ligne d'un autre élément

Messagepar Helene Charpentier » 09 Mar 2019, 06:52

C'est trop beau ! C'est trop beau ! Aaaaaaah c'est trop beau !
(Merci)

Code : Tout sélectionner

# Aide Mickael
?base::filter
?dplyr::filter

canouil <- function(n, mabase) {
  b <- boxplot(mabase[[n]])
  p <- b$out
  res1 <- dplyr::filter(.data = mabase, get(n) %in% p)
  res2 <- dplyr::group_by(.data = res1, Pays)
  res3 <- dplyr::summarise(res2, mean(get(n)), min(get(n)), max(get(n)))
  return(res3)
}
canouil("CO2",ChocsEtCO2_Base)
canouil("Catastrophes",ChocsEtCO2_Base)


Bon, il me dit plein d'erreurs mais tant pis :

Code : Tout sélectionner

> canouil <- function(n, mabase) {
+   b <- boxplot(n, data = mabase, col="black")
+   p <- b$out
+   res1 <- dplyr::filter(.data = mabase, get(n) %in% p)
+   res2 <- dplyr::group_by(.data = res1, Pays)
+   res3 <- dplyr::summarise(res2, mean(get(n)), min(get(n)), max(get(n)))
+   return(res3)
+ }
Warning messages:
1: Unknown or uninitialised column: 'x'.
2: Unknown or uninitialised column: 'x'.
3: Unknown or uninitialised column: 'x'.
4: Unknown or uninitialised column: 'x'.
5: Unknown or uninitialised column: 'x'.
6: Unknown or uninitialised column: 'x'.
> boxplot("CO2",data=ChocsEtCO2_Base)
Error in x[floor(d)] + x[ceiling(d)] :
  non-numeric argument to binary operator
In addition: Warning messages:
1: Unknown or uninitialised column: 'x'.
2: Unknown or uninitialised column: 'x'.
3: Unknown or uninitialised column: 'x'.
4: Unknown or uninitialised column: 'x'.
> boxplot(CO2,data=ChocsEtCO2_Base)
> boxplot(Catastrophes,data=ChocsEtCO2_Base)
Error in boxplot(Catastrophes, data = ChocsEtCO2_Base) :
  object 'Catastrophes' not found
In addition: Warning messages:
1: Unknown or uninitialised column: 'x'.
2: Unknown or uninitialised column: 'x'.
> boxplot(ChocsEtCO2_Base[["CO2"]])
Warning messages:
1: Unknown or uninitialised column: 'x'.
2: Unknown or uninitialised column: 'x'.
3: Unknown or uninitialised column: 'x'.
4: Unknown or uninitialised column: 'x'.
> boxplot(ChocsEtCO2_Base[["Catastrophes"]])
Warning messages:
1: Unknown or uninitialised column: 'x'.
2: Unknown or uninitialised column: 'x'.
> View(ChocsEtCO2_Base)
Warning messages:
1: Unknown or uninitialised column: 'x'.
2: Unknown or uninitialised column: 'x'.
> View(ChocsEtCO2_Base)
> boxplot(ChocsEtCO2_Base[["Corrupt"]])
> b <- boxplot(mabase[[n]])
Error in boxplot(mabase[[n]]) : object 'mabase' not found
In addition: Warning messages:
1: Unknown or uninitialised column: 'x'.
2: Unknown or uninitialised column: 'x'.
3: Unknown or uninitialised column: 'x'.
4: Unknown or uninitialised column: 'x'.
> p <- b$out
Error: object 'b' not found
> res1 <- dplyr::filter(.data = mabase, get(n) %in% p)
Error in dplyr::filter(.data = mabase, get(n) %in% p) :
  object 'mabase' not found
> res2 <- dplyr::group_by(.data = res1, Pays)
Error in UseMethod("group_by_") :
  no applicable method for 'group_by_' applied to an object of class "list"
> res3 <- dplyr::summarise(res2, mean(get(n)), min(get(n)), max(get(n)))
Error in dplyr::summarise(res2, mean(get(n)), min(get(n)), max(get(n))) :
  object 'res2' not found
> return(res3)
Error: object 'res3' not found
> canouil <- function(n, mabase) {
+   b <- boxplot(mabase[[n]])
+   p <- b$out
+   res1 <- dplyr::filter(.data = mabase, get(n) %in% p)
+   res2 <- dplyr::group_by(.data = res1, Pays)
+   res3 <- dplyr::summarise(res2, mean(get(n)), min(get(n)), max(get(n)))
+   return(res3)
+ }
> canouil("CO2",ChocsEtCO2_Base)
# A tibble: 7 x 4
  Pays               `mean(get(n))` `min(get(n))` `max(get(n))`
  <chr>                       <dbl>         <dbl>         <dbl>
1 Bulgaria                    0.760         0.603         1.00
2 China                       0.873         0.632         1.41
3 Qatar                       0.621         0.621         0.621
4 Russian Federation          0.785         0.614         0.880
5 South Africa                0.841         0.703         0.953
6 Venezuela, RB               0.626         0.626         0.626
7 Zimbabwe                    0.602         0.602         0.602
> canouil("Catastrophes",ChocsEtCO2_Base)
# A tibble: 8 x 4
  Pays                      `mean(get(n))` `min(get(n))` `max(get(n))`
  <chr>                              <dbl>         <dbl>         <dbl>
1 Australia                           3.05          3.05          3.05
2 China                               7.95          7.95          7.95
3 India                               4.36          4.36          4.36
4 Iran, Islamic Rep.                  3.06          3.06          3.06
5 Kenya                               6.48          6.48          6.48
6 Korea, Dem. People’s Rep.           2.50          2.50          2.50
7 Niger                               7.53          7.53          7.53
8 Zambia                              4.20          4.20          4.20
>



J'arrête pas de jouer avec la fonction maintenant au lieu de continuer mon rapport :D


Merci à vous tous de m'avoir aidée et pour votre patience :)


------------

Image


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité