3 votes

R - Créer de nouvelles variables à partir d'un cadre de données en utilisant with()

J'ai appris qu'il fallait éviter d'utiliser les pièces jointes. Et à utiliser with() à la place. Cependant, il semble parfois que ce ne soit pas une solution dans tous les cas.

J'ai besoin de créer plusieurs nouvelles variables (matrices), caclulées à partir d'une seule et même valeur dans un data.frame :

df1 <- data.frame(Var1=rnorm(50,5), Var2=rnorm(50,12))

q5 <- quantile(df1$Var1,.05, na.rm=TRUE)# lower quantile
q95 <- quantile(df1$Var1,.95, na.rm=TRUE) # upper quantile
medx <- median(df1$Var1, na.rm=TRUE) # median
x.dens <- density(df1$Var1, na.rm=TRUE) # density

Je veux éviter l'utilisation fastidieuse et redondante de "data.frame$".

mais cela ne fonctionne pas :

with(df1, 
q5 <- quantile(Var1,.05, na.rm=TRUE),# lower quantile
q95 <- quantile(Var1,.95, na.rm=TRUE), # upper quantile
medx <- median(Var1, na.rm=TRUE), # median
x.dens <- density(df1$Var1, na.rm=TRUE)) # density

En effet, il s'agit toujours de la même opération, avec les mêmes réglages, mais une fonction différente.

Savez-vous comment surmonter l'utilisation élaborée du code

2voto

Sathish Points 462

Utiliser within() au lieu de with lorsque vous créez une variable dans l'environnement du cadre de données.

res <- within(df1, 
              q5 <- quantile(Var1,.05, na.rm=TRUE),# lower quantile
              q95 <- quantile(Var1,.95, na.rm=TRUE), # upper quantile
              medx <- median(Var1, na.rm=TRUE), # median
              x.dens <- density(df1$Var1, na.rm=TRUE)) # density

head( res)
#      Var1     Var2       q5
# 1 4.943871 12.29145 3.678482
# 2 4.844204 11.55671 3.678482
# 3 3.529248 12.00111 3.678482
# 4 4.521850 12.07434 3.678482
# 5 5.417942 11.41048 3.678482
# 6 6.358680 11.43133 3.678482

0voto

Feng Points 453

Si vous voulez obtenir les mêmes résultats que votre code contenant 'data.frame$' en utilisant with vous devez affecter explicitement les valeurs à l'environnement global (sinon les valeurs seront affectées à l'environnement de données et ne seront pas renvoyées) :

with(df1,{ 
     q5 <<- quantile(Var1,.05, na.rm=TRUE) # lower quantile
     q95 <<- quantile(Var1,.95, na.rm=TRUE)  # upper quantile
     medx <<- median(Var1, na.rm=TRUE)  # median
     x.dens <<- density(df1$Var1, na.rm=TRUE)}) # density

El <<- le fera.

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