R - 使用with()从数据框创建新变量

时间:2017-03-19 08:02:06

标签: r

我知道应该避免使用附件。并与()代替使用。 但是,有时似乎在所有情况下都不是解决方案。

我需要创建几个新的变量(矩阵),从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

我想避免繁琐/多余使用&#34; data.frame $&#34;

但这不起作用:

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
实际上,它是重复相同的操作,具有相同的设置,但功能不同。

您知道如何克服精心使用的代码

2 个答案:

答案 0 :(得分:2)

在数据框环境中创建变量时,

使用within()代替with

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

答案 1 :(得分:0)

如果您希望使用with与包含代码的'data.frame $'获得相同的结果,则应明确将值分配给全局环境(否则,值将在数据环境中分配,不会被退回):

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

<<-函数会执行此操作。