R语言(4)——数据框

1、综述

数据框可以类比matrix,数据框可以理解为每列的mode不同的matrix;这一点很像list和向量的关系:list是mode可以不同的向量。

同时,数据框也可以和list类别,数据框的组件间的mode可以不同,list也是,但是数据框不同组建的长度必须相同,而list可以不同。因此就技术层面而言,数据框是每个组件长度都相等的列表。


2、基本操作

2.1 创建

> d<-data.frame(kids,ages,stringAsFactors=FALSE)
> kids<-c("Jack","Jill")
> ages<-c(12,10)
> d<-data.frame(kids,ages,stringsAsFactors=FALSE)
> d
  kids ages stringAsFactors
1 Jack   12           FALSE
2 Jill   10           FALSE

 stringAsFactors,默认值为TRUE,表示会将string变为factor. 

2.2 访问

#方法一:采用组件的索引值
> d[[1]]
[1] "Jack" "Jill"
#方法二:采用组件名
> d$kids
[1] "Jack" "Jill"
#方法三:类似数组的操作方式
> d[,1]
[1] "Jack" "Jill"
#访问第一列
> d[1,]
  kids ages
1 Jack   12

2.3 使用str() 查看数据框结构

> d
  kids ages
1 Jack   12
2 Jill   10
> str(d)
'data.frame':	2 obs. of  2 variables:
 $ kids: Factor w/ 2 levels "Jack","Jill": 1 2
 $ ages: num  12 10

2.4 数据框的拆分与组合

2.4.1 取子集合

> examsquiz
  exam.1 exam.2 quiz
1    2.0    3.3  4.0
2    3.3    2.0  3.7
3    4.0    4.0  4.0
4    2.3    0.0  3.3
5    2.3    1.0  3.3
6    3.3    3.7  4.0

#方法一,取出的一列类型为向量
> examsquiz[2:5,2]
[1] 2 4 0 1
> class(examsquiz[2:5,2])
[1] "numeric"
#方法二,添加了drop=FALSE后,取出的一列类型为data.frame
> examsquiz[2:5,2,drop=FALSE]
  exam.2
2      2
3      4
4      0
5      1
> class(examsquiz[2:5,2,drop=FALSE])
[1] "data.frame"
#方法三,条件筛选
> examsquiz[examsquiz$exam.1>3,]
  exam.1 exam.2 quiz
2    3.3    2.0  3.7
3    4.0    4.0  4.0
6    3.3    3.7  4.0

#方法四,subset()筛选函数,采用该函数筛选,会将筛选条件<span style="font-family: Arial, Helvetica, sans-serif;">exam.1中含NA的行自动去除掉;而上面的方法三则不能去除NA</span>
<pre name="code" class="plain">> subset(examsquiz,exam.1>3)
 

2.3.2 组合

#rbind()函数添加行
> d
  kids ages
1 Jack   12
2 Bill   10
> d<-rbind(d,list("Tom",10))
> d
  kids ages
1 Jack   12
2 Bill   10
3  Tom   10
#注意,添加的时候,要用list("Tom",10),因为,Tom和10的数据类型不同。

#cbind()函数添加列
> d<-cbind(d,list(1,1,1))
> d
  kids ages 1 1 1
1 Jack   12 1 1 1
2 Bill   10 1 1 1
3  Tom   10 1 1 1
#注意,上面例子中,添加列是采用了list的形式,则添加除了,因为frame的列列内的数据类型必须相同,而list中每个组件的数据类型不同,故R自动创建了三个列,来分别放置list的三个组件。

#采用c()的时候,则只新建了一列。
> d<-cbind(d,c(1,1,1))
> d
  kids ages 1 1 1 c(1, 1, 1)
1 Jack   12 1 1 1          1
2 Bill   10 1 1 1          1
3  Tom   10 1 1 1          1


merge() 函数:根据两个数据表中的相同的列,将两个数据表合并到一起

#当两个数据表中有名字相同的列时
> d1
     kids states
1    Jack     CA
2    Jill     MA
3 Jillian     MA
4    John     HI
> d2
  ages    kids
1   10    Jill
2    7 Lillian
3   12    Jack
> d3<-merge(d1,d2)
> d3
  kids states ages
1 Jack     CA   12
2 Jill     MA   10

#当两个数据表中没有名字相同的列时,
> names(d1)
[1] "kids"   "states"
> names(d1)[1]<-"name"
> d1
     name states
1    Jack     CA
2    Jill     MA
3 Jillian     MA
4    John     HI
> d3<-merge(d1,d2,by.x="name",by.y="kids")
> d3
  name states ages
1 Jack     CA   12
2 Jill     MA   10

2.4 NA处理

2.4.1 进行函数运算时对NA的处理

#函数操作时,去掉NA
> x<-c(2,NA,4)
> mean(x)
[1] NA
> mean(x,na.rm=TRUE)
[1] 3

2.4.2 选出不含NA的frame集

#生成一个带有NA的frame
> kids<-c('Jack',NA,'Jillian','John')
> states<-c('CA','MA','MA',NA)
> d<-data.frame(kids,states)
> d
     kids states
1    Jack     CA
2    <NA>     MA
3 Jillian     MA
4    John   <NA>

#方法一:取出不含NA的行,可以通过这种方法,过滤部分列同时保留在某些列中含有NA的item
> complete.cases(d)
[1]  TRUE FALSE  TRUE FALSE
> d2<-d[complete.cases(d),]
> d2
     kids states
1    Jack     CA
3 Jillian     MA
<pre name="code" class="plain">#方法二:取出不含NA的行,会将所有含NA的行都去除,不如方法一灵活,但很简单省力。
> na.omit(d)
     kids states
1    Jack     CA
3 Jillian     MA
 

 

2.5 rbind(),cbind(),apply()函数



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值