R-数据结构-数据框

数据框虽然和矩阵相似,都有行、列两个维度,但是数据框的列可以是不同的模式(某列可以是数字,某列可能是字符串)
数据框是每个组件长度都相等的列表。数据框是特殊的列表

1.创建数据框

###########创建数据框
> kids<-c("Jack","Jill")
> ages<-c(12,10)
> d<-data.frame(kids,ages,stringsAsFactors = F)
## stringsAsFactors = F告诉R不将向量转化成因子,默认是转化的
> d
  kids ages
1 Jack   12
2 Jill   10
#############访问数据框
> d[[1]]
[1] "Jack" "Jill"
> d$kids
[1] "Jack" "Jill"
> d[,1]
[1] "Jack" "Jill"
##用str()函数查看d的内部结构
> str(d)
'data.frame':	2 obs. of  2 variables:
 $ kids: chr  "Jack" "Jill"
 $ ages: num  12 10
 #############命名
 > examda<-read.table("C:/Users/NANRUN/Desktop/exam.txt",header = F)
> colnames(examda)<-c("Exam.1","Exam.2","Quiz")
> examda
  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

2.矩阵式操作

提取子数据框

> examda[2:4,]
  Exam.1 Exam.2 Quiz
2    3.3      2  3.7
3    4.0      4  4.0
4    2.3      0  3.3
> examda[2:4,2]
[1] 2 4 0
> examda[2:4,2,drop=F] ###返回值为数据框
  Exam.2
2      2
3      4
4      0
###########筛选
> examda[examda$Exam.1>3.0,]
  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(examda,Exam.1>3.0) ####subset()函数筛选
  Exam.1 Exam.2 Quiz
2    3.3     NA    4
3    4.0    4.0    4
6    3.3    3.7    4

缺失值的处理

> examda[2,]<-c(3.3,NA,4.0)
> examda
  Exam.1 Exam.2 Quiz
1    2.0    3.3  4.0
2    3.3     NA  4.0
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
> mean(examda$Exam.2,na.rm=TRUE)###忽略缺失值
[1] 2.4
#####使用complete.cases()函数去掉含缺失值的行
> complete.cases(examda)
[1]  TRUE FALSE  TRUE  TRUE  TRUE  TRUE
> examda1<-examda[complete.cases(examda),]
> examda1
  Exam.1 Exam.2 Quiz
1    2.0    3.3  4.0
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

使用rbind() 、cbind()函数

使用这两个函数前,要保证两个数据框的行数或者列数相同。

> d<-data.frame(kids,ages,stringsAsFactors = F)
  kids ages
1 Jack   12
2 Jill   10
> rbind(d,list("Laura",19))
   kids ages
1  Jack   12
2  Jill   10
3 Laura   19
> eq<-cbind(examda,examda$Exam.2-examda$Exam.1)
> class(eq)
[1] "data.frame"
> head(eq)
  Exam.1 Exam.2 Quiz examda$Exam.2 - examda$Exam.1
1    2.0    3.3  4.0                           1.3
2    3.3     NA  4.0                            NA
3    4.0    4.0  4.0                           0.0
4    2.3    0.0  3.3                          -2.3
5    2.3    1.0  3.3                          -1.3
6    3.3    3.7  4.0                           0.4
> examda$ExamDiff<-examda$Exam.2 - examda$Exam.1
> examda
  Exam.1 Exam.2 Quiz ExamDiff
1    2.0    3.3  4.0      1.3
2    3.3     NA  4.0       NA
3    4.0    4.0  4.0      0.0
4    2.3    0.0  3.3     -2.3
5    2.3    1.0  3.3     -1.3
6    3.3    3.7  4.0      0.4

3. 合并数据框

merge(x,y) 合并数据框。
如果这两个数据框都有某几个变量,那么将共同变量的共同观测合并;如果这两个数据框的变量值相同但变量名不同,则需要设置参数by.x 和by.y

> kids<-c("Jack","Jill","John")
>  ages<-c(12,10,15)
>  d1<-data.frame(kids,ages,stringsAsFactors = F)
>  d1
  kids ages
1 Jack   12
2 Jill   10
3 John   15
> kids<-c("Jill","Jack","Lillian")
> states<-c("CA","MA","HI")
> d2<-data.frame(kids,states,stringsAsFactors = F)
> d2
     kids states
1    Jill     CA
2    Jack     MA
3 Lillian     HI
> merge(d1,d2) ####合并数据框,其结果是合并两个数据集都有的变量
  kids ages states
1 Jack   12     MA
2 Jill   10     CA
> pals<-c("Jill","Jack","Lillian")
> states<-c("CA","MA","HI")
> d3<-data.frame( pals,states,stringsAsFactors = F)
> merge(d1,d3,by.x="kids",by.y = "pals")
  kids ages states
1 Jack   12     MA
2 Jill   10     CA

4.lapply() 、sapply()应用于数据框

>  d1
  kids ages
1 Jack   12
2 Jill   10
3 John   15
> d2<-lapply(d1,sort) ####sort是升序排列
> d2
$kids
[1] "Jack" "Jill" "John"

$ages
[1] 10 12 15

> as.data.frame(d2)  ####强制转化成数据框,但是这样是没有意义的,丢失了名字和年龄的对应关系
  kids ages
1 Jack   10
2 Jill   12
3 John   15

一个小例子:应用Logistic模型

####用高度、重量、环数等8个变量中的一个来预测性别
aba<-read.csv("C:/Users/NANRUN/Desktop/abalone.csv")
abamf<-aba[aba$Sex != "I",]###删掉幼鱼的观测
abamf$Sex<-ifelse(abamf$Sex=="M",1,0)

lftn<-function(clmn){
  glm(abamf$Sex ~ clmn,family=binomial)$coef###Logistic模型
}
loall<-sapply(abamf[,-1],lftn)###对除了性别这一列的数据使用lftn函数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值