R语言笔记-用基本包处理数据框

本文介绍了如何使用R语言的基本包来操作数据框,包括查看数据框内容、选取子集、排序、处理重复数据、添加删除变量以及将数据框加入搜索路径。详细讲解了如、`head()`, `tail()`, `str()`, `attributes()`等函数的用法,以及行列限定语法和随机抽样的实现。" 121360929,7467629,使用ArcGIS API进行地图交互绘图,"['GIS开发', 'ArcGIS', 'JavaScript', '前端框架', '地图API']

查看数据框内容

函数解释
head()显示数据集前几行
tail()显示数据集后几行
str()数据集概览
attributes()更详细的数据集信息查看
des()数据集中变量基本信息查看

以epiDisplay包下的Familydata数据集为例:

> library(epiDisplay)
> data("Familydata")
  • 直接输入数据框名称:等价于使用print()函数
    • 对于比较大的数据框,会占用很多屏幕
  • head(somedataframe,n=N):只显示数据框的前N行,默认为6
> head(Familydata)
  code age  ht wt money sex
1    K   6 120 22     5   F
2    J  16 172 52    50   M
3    A  80 163 71   100   M
4    I  18 158 51   200   F
5    C  69 153 51   300   F
6    B  72 148 60   500   F
  • tail(somedataframe,n=N):只显示数据框的后N行,默认为6
> tail(Familydata)
   code age  ht wt money sex
6     B  72 148 60   500   F
7     G  46 160 50   500   F
8     H  42 163 55   600   F
9     D  58 170 67  2000   M
10    F  47 155 53  2000   F
11    E  49 167 64  5000   M
  • names(somedataframe):只显示数据框中的变量名
> names(Familydata)
[1] "code"  "age"   "ht"    "wt"    "money" "sex"  
  • str(somedataframe):探索数据框结构
> str(Familydata)
'data.frame':	11 obs. of  6 variables:
# 对象的类型为数据框,有11个观测数,6个变量
 $ code : chr  "K" "J" "A" "I" ...
 $ age  : int  6 16 80 18 69 72 46 42 58 47 ...
 $ ht   : int  120 172 163 158 153 148 160 163 170 155 ...
 $ wt   : int  22 52 71 51 51 60 50 55 67 53 ...
 $ money: int  5 50 100 200 300 500 500 600 2000 2000 ...
 $ sex  : Factor w/ 2 levels "F","M": 1 2 2 1 1 1 1 1 2 1 ...
 # 列举了数据框中所有变量的类型、前几个取值,对于因子还给出了因子的水平
 - attr(*, "datalabel")= chr "Anthropometric and financial data of a hypothetical family" # 数据集的概述
 - attr(*, "time.stamp")= chr "23 Nov 2006 17:15" # 数据建立时间
 - attr(*, "formats")= chr [1:6] "%9s" "%8.0g" "%8.0g" "%8.0g" ... # 数据呈现格式
 - attr(*, "types")= int [1:6] 128 98 105 98 105 108
 - attr(*, "val.labels")= chr [1:6] "" "" "" "" ... # 变量标签
 - attr(*, "var.labels")= chr [1:6] "" "Age(yr)" "Ht(cm.)" "Wt(kg.)" ...
 - attr(*, "version")= int 7 # 版本号
 - attr(*, "label.table")=List of 6
 # 给出了数据框的一些属性 (-attr)
  ..$ sex1: Named num [1:2] 1 2
  .. ..- attr(*, "names")= chr [1:2] "F" "M"
  ..$     : NULL
  ..$     : NULL
  ..$     : NULL
  ..$     : NULL
  ..$     : NULL
  • attributes(somedataframe):给出数据框的全部属性信息
$names
[1] "code"  "age"   "ht"    "wt"    "money" "sex"  

$row.names
 [1]  1  2  3  4  5  6  7  8  9 10 11

$class
[1] "data.frame"

$datalabel
[1] "Anthropometric and financial data of a hypothetical family"

$time.stamp
[1] "23 Nov 2006 17:15"

$formats
[1] "%9s"   "%8.0g" "%8.0g" "%8.0g" "%8.0g" "%8.0g"

$types
[1] 128  98 105  98 105 108

$val.labels
[1] ""     ""     ""     ""     ""     "sex1"

$var.labels
[1] ""                 "Age(yr)"          "Ht(cm.)"         
[4] "Wt(kg.)"          "Pocket money(B.)" ""                

$version
[1] 7

$label.table
$label.table$sex1
F M 
1 2 

$label.table[[2]]
NULL

$label.table[[3]]
NULL

$label.table[[4]]
NULL

$label.table[[5]]
NULL

$label.table[[6]]
NULL
  • 查看和修改数据框的属性:使用函数attributes(somedataframe)$someattribute
> attributes(Familydata)$var.labels # 显示该数据框中所有变量的标签 (起到对变量的解释作用)
[1] ""                 "Age(yr)"          "Ht(cm.)"         
[4] "Wt(kg.)"          "Pocket money(B.)" "" 
> attributes(Familydata)$var.labels[1]<-"ID code" # 使用向量操作,对属性进行修改
> attributes(Familydata)$var.labels[6]<-"Gender"
> attributes(Familydata)$var.labels
[1] "ID code"          "Age(yr)"          "Ht(cm.)"         
[4] "Wt(kg.)"          "Pocket money(B.)" "Gender"   # 可以看到,标签的第1、6项被修改了
  • 查看变量的基本信息和标签:使用epiDisplay包中的des()函数
des(Familydata)
Anthropometric and financial data of a hypothetical family  # 数据集的概述
 No. of observations =  11  # 观测数
  Variable      Class           Description     
1 code          character       ID code         
2 age           integer         Age(yr)         
3 ht            integer         Ht(cm.)         
4 wt            integer         Wt(kg.)         
5 money         integer         Pocket money(B.)
6 sex           factor          Gender    # 所有变量的名称、类型、标签

选取数据框的子集

行列限定语法

  • 和矩阵操作类似,使用somedataframe[somerow,somecol]语法。
  • 选取某几行数据
> Familydata[1:3,]
  code age  ht wt money sex
1    K   6 120 22     5   F
2    J  16 172 52    50   M
3    A  80 163 71   100   M
  • 选取某几列数据
> Familydata[,c("code","age","sex")]
   code age sex
1     K   6   F
2     J  16   M
3     A  80   M
4     I  18   F
5     C  69   F
6     B  72   F
7     G  46   F
8     H  42   F
9     D  58   M
10    F  47   F
11    E  49   M
  • 使用逻辑表达式,选取符合特定条件的个案
> Familydata[Familydata$sex=="F",] # 选取sex变量为"F"的所有个案
   code age  ht wt money sex
1     K   6 120 22     5   F
4     I  18 158 51   200   F
5     C  69 153 51   300   F
6     B  72 148 60   500   F
7     G  46 160 50   500   F
8     H  42 163 55   600   F
10    F  47 155 53  2000   F

使用函数subset()

语法:subset(somedataframe, 变量限定条件, select=选取的变量构成的列向量)

subset(Familydata,sex=="F") # 选取sex变量为"F"的所有个案
subset(Familydata,sex=="F",select=c("code","sex")) # 选取sex变量为"F"的所有个案的code、sex变量列

使用函数sample()实现随机抽样

  • 语法:sample(somevector,size=N,replace=TRUE/FALSE)
    • somevector:抽样来源的列向量
    • size:抽取样本的大小
    • replace:用于限定是否为放回抽样
> S<-sample(1:10,size=3,replace = FALSE) # 从1~10中随机抽出3个数
> S
[1]  2 10  6
  • 与子集选择语法结合,实现从数据集中随机抽样
> sample.rows<-sample(1:nrow(Familydata),size=3,replace = FALSE) # nrow函数将返回数据框的个案数
> Familydata[sample.rows,]
  code age  ht wt money sex
7    G  46 160 50   500   F
6    B  72 148 60   500   F
9    D  58 170 67  2000   M

对个案进行排序

语法:somedataframe[order(somedataframe$somevariable),]

  • order()函数中默认对变量进行升序排序,若需要降序排序,需要声明参数decreasing=TRUE
> Familydata[order(Familydata$age,decreasing = TRUE),] # 对数据集中的个案以age降序进行排序
   code age  ht wt money sex
3     A  80 163 71   100   M
6     B  72 148 60   500   F
5     C  69 153 51   300   F
9     D  58 170 67  2000   M
11    E  49 167 64  5000   M
10    F  47 155 53  2000   F
7     G  46 160 50   500   F
8     H  42 163 55   600   F
4     I  18 158 51   200   F
2     J  16 172 52    50   M
1     K   6 120 22     5   F

查找和删除重复数据

查找重复数据

  • duplicated(somevector):对某一向量,逐个元素地检查该元素是否与前面任一元素重复,并返回一由逻辑值组成的向量 (若不重复,返回FALSE,否则返回TRUE)
> A<-c(1,2,3,2)
> duplicated(A)
[1] FALSE FALSE FALSE  TRUE
  • any(somelogicvariable):对某一全由逻辑值构成的向量,检查其是否有任一元素为TRUE;若全为FALSE,返回FALSE,否则返回TRUE
> any(duplicated(Familydata$code)) #检查数据框中code变量是否有重复值
[1] FALSE

删除重复数据

  • somedataframe[!duplicated(somedataframe$somevector),]:查找并删除某数据框中某变量取值重复的所有个案,输出一个新的数据框
> ID=c(1,2,3,4,4)
> age=c(12,14,15,16,16)
> score=c(90,85,80,72,72)
> M=data.frame(ID,age,score)
> M
  ID age score
1  1  12    90
2  2  14    85
3  3  15    80
4  4  16    72
5  4  16    72
> M.nodup<-M[!duplicated(M$ID),] # 查找M中ID变量有重复的所有个案并删除,结果保存于M.nodup
> M.nodup
  ID age score
1  1  12    90
2  2  14    85
3  3  15    80
4  4  16    72

添加和删除变量

添加变量

  • somedataframe$newvector<-somedefinition:以声明新向量的形式加入新变量
> M$logscore<-log10(M$score) # 计算变量并赋值为新变量
> M
  ID age score logscore
1  1  12    90 1.954243
2  2  14    85 1.929419
3  3  15    80 1.903090
4  4  16    72 1.857332
5  4  16    72 1.857332
  • transform(somedataframe, somenewvector=somedefinition):以transform函数定义新变量
# 上例中M$logscore<-log10(M$score)的等价写法:
transform(M,logscore=log10(score))

删除变量

  • somedataframe[,-somevariablenumber]:从数据框中删除特定序号的变量
> M
  ID age score
1  1  12    90
2  2  14    85
3  3  15    80
4  4  16    72
5  4  16    72
> M[,-3] # 将M的第3列删除
  ID age
1  1  12
2  2  14
3  3  15
4  4  16
5  4  16
  • somedataframe$somevector<-NULL:在原数据框上操作,将某变量设定为空值 (永久删除)

将数据框加入搜索路径

  • attach(somedataframe):将数据框加入搜索路径,如此可以直接引用其中变量而无需声明其所在的数据框
> M
  ID age score
1  1  12    90
2  2  14    85
3  3  15    80
4  4  16    72
5  4  16    72
> age
错误: 找不到对象'age'
> attach(M) # 将数据框M加入搜索路径
> age
[1] 12 14 15 16 16 # 如此可以检索到M下的变量age
  • search():查看目前搜索路径下有哪些内容
  • detach(somedataframe):将数据框从搜索路径中移除
> detach(M) # 将M从搜索路径中移除
> age
错误: 找不到对象'age'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值