第四章:数据操作Ⅰ 第九节:访问数据框中的列

本文介绍了R语言中with()、within()函数用于简化数据访问,以及attach()和detach()函数改变搜索路径以直接访问数据框列的功能。通过实例演示了如何使用这些函数并指出它们的区别和注意事项。
摘要由CSDN通过智能技术生成

我们可以使用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

 

  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值