我们可以使用with()、within(),attach(),detach()等函数访问数据框中的列
注:with()和attach()的不同
With()、within()将显示数据视为环境,以评估表达式。而attach()、detach()采用修改名称搜索路径的方式
一、with()函数
With()函数允许用户只使用属性名访问数据框或列表中的属性
例如:
我们求鸢尾花数据集的平均值
> print(mean(iris$Sepal.Length))
[1] 5.843333
> print(mean(iris$Sepal.Width))
[1] 3.057333
会发现都要使用iris$colname的形式来编写代码。若使用with()函数,则可以直接访问各列
> with(iris,{print(mean(Sepal.Length))
+ print(mean(Sepal.Width))})
[1] 5.843333
[1] 3.057333
二、within()函数
Within()函数与with()函数类似,但其提供了数据修改功能
例如
向量中某些数据为缺失值的时候,我们可以利用此函数将其修改为中位数
> (x<-data.frame(val=c(1,2,3,4,NA,5,NA)))
val
1 1
2 2
3 3
4 4
5 NA
6 5
7 NA
> x<-within(x,{val=ifelse(is.na(val),median(val,na.rm = TRUE),val)})
> x
val
1 1
2 2
3 3
4 4
5 3
6 5
7 3
上述代码类似于以下代码
x$val[is.na(x$val)]<-median(x$val,na.rm=T)
三、attach()函数与detach()函数
使用with()与within()函数,只能在参数传递的expr中直接访问数据框的列,而使用attach()与detach()函数,则可以在它们之间的所有代码中直接访问数据框的列
例如
我们可以使用attach()函数将iris添加到R的搜索路径,这样可以之际访问到iris的所有属性,然后调用detach()函数,将iris从R的搜索路径中删除
> Sepal.width
错误: 找不到对象'Sepal.width'
> attach(iris)
> head(Sepal.Width)
[1] 3.5 3.0 3.2 3.1 3.6 3.9
> detach(iris)
> Sepal.width
错误: 找不到对象'Sepal.width'
之所以能够直接通过名称访问数据,调用attach()函数修改了R对象的搜索路径,在调用attach(iris)后,使用search()函数查看搜索路径,可以看到已添加iris()
> search()
[1] ".GlobalEnv" "package:SeuratObject" "package:sp"
[4] "tools:rstudio" "package:stats" "package:graphics"
[7] "package:grDevices" "package:utils" "package:datasets"
[10] "package:methods" "Autoloads" "package:base"
> attach(iris)
> search()
[1] ".GlobalEnv" "iris" "package:SeuratObject"
[4] "package:sp" "tools:rstudio" "package:stats"
[7] "package:graphics" "package:grDevices" "package:utils"
[10] "package:datasets" "package:methods" "Autoloads"
[13] "package:base"
> detach(iris)
> search()
[1] ".GlobalEnv" "package:SeuratObject" "package:sp"
[4] "tools:rstudio" "package:stats" "package:graphics"
[7] "package:grDevices" "package:utils" "package:datasets"
[10] "package:methods" "Autoloads" "package:base"
但是需要注意的是,调用attach()函数后,对变量的修改并不会反映到调用detach()函数时候的原始数据
例如:
> head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
> attach(iris)
The following objects are masked from iris (pos = 3):
Petal.Length, Petal.Width, Sepal.Length, Sepal.Width, Species
> Sepal.Width[1]=-1
> Sepal.Width
[1] -1.0 3.0 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 3.7 3.4 3.0 3.0 4.0 4.4 3.9
[18] 3.5 3.8 3.8 3.4 3.7 3.6 3.3 3.4 3.0 3.4 3.5 3.4 3.2 3.1 3.4 4.1 4.2
[35] 3.1 3.2 3.5 3.6 3.0 3.4 3.5 2.3 3.2 3.5 3.8 3.0 3.8 3.2 3.7 3.3 3.2
[52] 3.2 3.1 2.3 2.8 2.8 3.3 2.4 2.9 2.7 2.0 3.0 2.2 2.9 2.9 3.1 3.0 2.7
[69] 2.2 2.5 3.2 2.8 2.5 2.8 2.9 3.0 2.8 3.0 2.9 2.6 2.4 2.4 2.7 2.7 3.0
[86] 3.4 3.1 2.3 3.0 2.5 2.6 3.0 2.6 2.3 2.7 3.0 2.9 2.9 2.5 2.8 3.3 2.7
[103] 3.0 2.9 3.0 3.0 2.5 2.9 2.5 3.6 3.2 2.7 3.0 2.5 2.8 3.2 3.0 3.8 2.6
[120] 2.2 3.2 2.8 2.8 2.7 3.3 3.2 2.8 3.0 2.8 3.0 2.8 3.8 2.8 2.8 2.6 3.0
[137] 3.4 3.1 3.0 3.1 3.1 3.1 2.7 3.2 3.3 3.0 2.5 3.0 3.4 3.0
> detach(iris)
> head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
我们可以看到,先使用attach()函数将iris添加到R搜索路径之后,修改Sepal.Width的值,但可以看到,修改的值并未反映到iris