Modérateur : Groupe des modérateurs
Code : Tout sélectionner
library(tidyverse)
donnees <- read_delim("id N V1 V2
1 A 6 NA
2 B 5 NA
3 A 8 NA
4 B 7 NA
5 A 4 6-8=-2
6 B 5 5-7=-2
7 A 2 8-4=+4
8 B 1 7-5=+2
9 A 9 2-9=-7
10 B 1 5-1=+4", delim = " ")
donnees %>%
group_by(N) %>%
mutate(V3 = lag(V1, 2) - lag(V1))
Code : Tout sélectionner
# A tibble: 10 x 5
# Groups: N [2]
id N V1 V2 V3
<dbl> <chr> <dbl> <chr> <dbl>
1 1 A 6 NA NA
2 2 B 5 NA NA
3 3 A 8 NA NA
4 4 B 7 NA NA
5 5 A 4 6-8=-2 -2
6 6 B 5 5-7=-2 -2
7 7 A 2 8-4=+4 4
8 8 B 1 7-5=+2 2
9 9 A 9 2-9=-7 2
10 10 B 1 5-1=+4 4
Code : Tout sélectionner
X <- data.frame(N=sample(LETTERS[1:2], 10, replace=TRUE),
V1=sample.int(10, replace=TRUE),
V2=NA)
for (case in levels(X$N)) {
xdata <- X[as.character(X$N)==case,]
for (i in 3:nrow(xdata)) {
xdata$V2[i] <- xdata$V1[i-2] - xdata$V1[i-1]
}
X[as.character(X$N)==case,]$V2 <- xdata$V2
}
Michaël Delorme a écrit :Si j'ai bien compris (une erreur à la ligne 9 ?)...
Avec lag et des données groupées sur N :Code : Tout sélectionner
library(tidyverse)
donnees <- read_delim("id N V1 V2
1 A 6 NA
2 B 5 NA
3 A 8 NA
4 B 7 NA
5 A 4 6-8=-2
6 B 5 5-7=-2
7 A 2 8-4=+4
8 B 1 7-5=+2
9 A 9 2-9=-7
10 B 1 5-1=+4", delim = " ")
donnees %>%
group_by(N) %>%
mutate(V3 = lag(V1, 2) - lag(V1))
ce qui donne :Code : Tout sélectionner
# A tibble: 10 x 5
# Groups: N [2]
id N V1 V2 V3
<dbl> <chr> <dbl> <chr> <dbl>
1 1 A 6 NA NA
2 2 B 5 NA NA
3 3 A 8 NA NA
4 4 B 7 NA NA
5 5 A 4 6-8=-2 -2
6 6 B 5 5-7=-2 -2
7 7 A 2 8-4=+4 4
8 8 B 1 7-5=+2 2
9 9 A 9 2-9=-7 2
10 10 B 1 5-1=+4 4
Code : Tout sélectionner
donnees <- read_delim("N","V1", delim = " ")
Code : Tout sélectionner
X <- data.frame(V1=sample(LETTERS[1:2], 760, replace=TRUE)
Code : Tout sélectionner
library(tidyverse)
donnees %>%
group_by(N) %>%
mutate(V2 = lag(V1, 2) - lag(V1))
Augustin Zindel a écrit :Pour celui d'Eric :
Je pense que l'argumentLETTERS[1:2] bloque car du coup il ne renvoie que 2 lettres ("A" et "B") dans le nouveau dataframe X, or N contient 20 mots. Il faudrait un argument qui puisse le remplacer par un argument qui dise "Chacun des 20 mots que contient N". J'ai essayé avec l'argument "words" mais cela ne marche pas... Est-ce que tu vois une solution ?Code : Tout sélectionner
X <- data.frame(V1=sample(LETTERS[1:2], 760, replace=TRUE)
Merci à vous pour vos réponses,
Augustin
Eric Casellas a écrit :Dans mon code cette partie était pour générer (aléatoirement par tirage via la fonction sample) les données de départ.
Donc soit tu pars directement de tes données existantes, soit tu peut changer le nombre de cas générés différents en changeant la valeur des choix possibles (par exemple pour avoir les 20 première lettre remplacer LETTERS[1:2] par LETTERS[1:20])
Eric
Code : Tout sélectionner
X <- data.frame(N=sample(levels(donnees$N), 760, replace=TRUE),
V1=sample.int(760, replace=TRUE),
V2=NA)
for (case in levels(X$N)) {
xdata <- X[as.character(X$N)==case,]
for (i in 3:nrow(xdata)) {
xdata$V2[i] <- xdata$V1[i-2] - xdata$V1[i-1]
}
X[as.character(X$N)==case,]$V2 <- xdata$V2
}
la partie du code avec read_delim n'est pas nécessaire (je l'ai mise pour avoir un exemple reproductible). Tout ce dont tu as besoin c'est (si ton dataframe s'appelle "donnees", ta colonne de regroupement "N" et tes valeurs "V1") :Code : Tout sélectionner
library(tidyverse)
donnees %>%
group_by(N) %>%
mutate(V2 = lag(V1, 2) - lag(V1))
Augustin Zindel a écrit :Eric Casellas a écrit :Dans mon code cette partie était pour générer (aléatoirement par tirage via la fonction sample) les données de départ.
Donc soit tu pars directement de tes données existantes, soit tu peut changer le nombre de cas générés différents en changeant la valeur des choix possibles (par exemple pour avoir les 20 première lettre remplacer LETTERS[1:2] par LETTERS[1:20])
Eric
Eric :
Ah d'accord, je retiens pour le tirage aléatoire. Donc oui je souhaite partir de mes modalités existantes de V1 (catégorielle à 20 modalités). J'ai essayé ce code-ci :Code : Tout sélectionner
X <- data.frame(N=sample(levels(donnees$N), 760, replace=TRUE),
V1=sample.int(760, replace=TRUE),
V2=NA)
for (case in levels(X$N)) {
xdata <- X[as.character(X$N)==case,]
for (i in 3:nrow(xdata)) {
xdata$V2[i] <- xdata$V1[i-2] - xdata$V1[i-1]
}
X[as.character(X$N)==case,]$V2 <- xdata$V2
}
Je n'ai pas de message d'erreur. Mais j'obtiens le dataframe xdata avec 39 observations seulement au lieu de 760 (car correspond à toutes les observations mais pour une seule des modalités de N), des valeurs de V1 complètement modifiées (positives seulement, allant jusqu'à 730 et quelques) et des valeurs de V2 allant jusqu'à 640. V1 contient des valeurs comprises normalement entre 1 et 20.
Alors que rentrer comme 1er argument à la première ligne de ton code, où j'ai mis "levels(donnees$N) ? Ou le problème vient-il d'ailleurs ?
Eric Casellas a écrit :
Je ne suis pas sûr de ce que tu veux faire mais à priori j'aurais dis que tu devrais plutôt remplacer dans mon code l'objet X par ton donnees et donc tu n'as pas à construire l'objet X via sample (par contre dans mon exemple la colonne N est un factor et pas un character, je ne sais pas ce que tu as de ton coté...)
Eric
Code : Tout sélectionner
for (case in levels(donnees$N)) {
xdata <- donnees[as.factor(donnees$N)==case,]
for (i in 760:nrow(xdata)) {
xdata$V2[i] <- xdata$V1[i-2] - xdata$V1[i-1]
}
donnees[as.factor(donnees$N)==case,]$V2 <- xdata$V2
}
Code : Tout sélectionner
Error in `$<-.data.frame`(`*tmp*`, "V2", value = c(NA_real_, NA_real_, : replacement has 760 rows, data has 38
Augustin Zindel a écrit :Bonjour Eric,
Si je pense que tu as compris ce que je voulais faire (calculer la différence i-2 - i-1 (des 2 dernières observations) de la variable V1 pour chacune des 20 modalités de ma variable N.
J'ai essayé de faire comme tu m'as dit, j'ai changé le code pour :Code : Tout sélectionner
for (case in levels(donnees$N)) {
xdata <- donnees[as.factor(donnees$N)==case,]
for (i in 760:nrow(xdata)) {
xdata$V2[i] <- xdata$V1[i-2] - xdata$V1[i-1]
}
donnees[as.factor(donnees$N)==case,]$V2 <- xdata$V2
}
En changeant du coup as.character par as.factor vu que N est en as.factor (bonne idée ou non?). J'ai dans mon dataframe 760 observations et R me renvoit le message d'erreur suivant:Code : Tout sélectionner
Error in `$<-.data.frame`(`*tmp*`, "V2", value = c(NA_real_, NA_real_, : replacement has 760 rows, data has 38
j'ai 38 observations pour chacune des modalités de ma variable N donc je pense que R ne prend en compte qu'une seule de ces modalités (problème à la ligne " xdata <- donnees[as.factor(donnees$N)==case,]" on donne qu'une seule modalité de N dans xdata non ?
Bonne fin de matinée,
Augustin.
Code : Tout sélectionner
for (case in levels(donnees$N)) {
xdata <- donnees[as.factor(donnees$N)==case,]
for (i in 3:nrow(xdata)) {
xdata$V2[i] <- xdata$V1[i-2] - xdata$V1[i-1]
}
donnees[as.factor(donnees$N)==case,]$V2 <- xdata$V2
}
Code : Tout sélectionner
match$V2 <- NA
Code : Tout sélectionner
donnees$V2 <- NA
for (case in levels(donnees$N)) {
xdata <- donnees[(donnees$N)==case,]
for (i in 3:nrow(xdata)) {
xdata$V2[i] <- xdata$V1[i-2] - xdata$V1[i-1]
}
donnees[(donnees$N)==case,]$V2 <- xdata$V2
}
Retourner vers « Questions en cours »
Utilisateurs parcourant ce forum : Google [Bot] et 1 invité