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

3
我了解到应该避免使用attach,而是使用with()。然而,在某些情况下似乎并不是所有问题的解决方案。
我需要从数据框中创建几个新变量(矩阵),这些变量都是从同一个值计算而来的。
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

我想避免冗余使用"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

实际上,这是重复执行相同操作,使用相同设置但具有不同功能。

你知道如何克服代码的繁琐使用吗?


使用 within 代替 with。 - Sathish
在尝试将其作为列创建之前,最好检查每个输出的 str。例如,您可以检查density的输出。 - akrun
2个回答

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

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

<<- 函数可以实现这个功能。


太好了,我读到了<<-的相关内容,但是在我的情况下没有找到如何使用它!非常感谢。 - Pharcyde
assign函数可以更安全地执行此操作。但在大多数情况下,<<-是一种快捷方式。@Pharcyde - Feng
1
如果你认为变量 a 非常有价值且不应该被改变,那么使用 <<- 将会导致很多麻烦,因为很难弄清楚 a 是如何被改变的。这并不是推荐的方式,所以我建议除非你有一个需要它的应用程序,否则不要使用它。 - Sathish
1
"<<-" 几乎总是不好的实践。除了基本的 R 之外,dplyr::mutate 或 package:data.table 可以使重复赋值更加美观。" - russellpierce
我知道<<-可能会带来的麻烦。我猜@Pharcyde只是想在工作区创建这些变量,而不是作为数据框中的列。所以我提供了这个解决方案。但你是对的,<<-是一个危险的运算符,通常应该避免使用。@Sathish - Feng
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接