frame简直是R中神一般的存在,翻译为数据框架,和矩阵很像,但绝对比矩阵更加强大, frame可以各种数据类型杂交,简直太方便了。下面介绍下简单的操作,因为。。。更深的操作我也不会,真的要靠日常积累吧。
创建frame
最基础的,一行一行创建,这个确实有点点傻,不过做生信的宝宝,谁会自己建表呢,都是生成的数据,简单测试而已。
student<-data.frame(ID=c(11,12,13),Name=c("Devin","Edward","Wenli"))
#查看一下
student
一些基本信息查看
> student
ID Name
1 11 Devin
2 12 Edward
3 13 Wenli
查看列名:
> row.names(student)
[1] "1" "2" "3"
查看行名:
> colnames(student)
[1] "ID" "Name"
#增加列
student$sex=c("b","g","b")
#增加行(新建一个表,把俩表绑定在一起,rbind是行绑定)
newstudent=data.frame(ID=c(14),Name=c("Peter"),sex=c("b"))
student=rbind(student,newstudent)
#删除最后一行(本来有4行,取前三行,赋值给原表)
student=student[1:3,]
两个表之间的合作
新建一个表:
home<-data.frame(ID=c(11,1,2),no=c(111,122,133))
#查找student表中是否有home表的学生(ID来区分)
sh=student[which(student$ID%in%home$ID),]
#或者按照列来匹配,student第一列和home第一列是否有交叉,有的话输出student信息
sh=student[which(student$ID%in%home[1,]),]
#两个表合并,按照ID合并
result=merge(student,home,by.x = "ID")
result
ID Name sex no
1 11 Devin b 111
查询子集
查询一个Date Frame,返回一个满足条件的子集,这相当于数据库中的表查询,是非常常见的操作。使用行和列的Index来获取子集是最简单的方法,前面已经提到过。如果我们使用布尔向量,配合which函数,可以实现对行的过滤。比如我们要查询所有Gender为F的数据,那么我们首先对student$Gender==“F”,得到一个布尔向量:FALSE FALSE TRUE,然后使用which函数可以将布尔向量中TRUE的Index返回,所以我们的完整查询语句就是:
student[which(student$Gender=="F"),]
注意这里列Index并没有输入,如果我们只想知道所有女生的年龄,那么可以改为:
student[which(student$Gender=="F"),"Age”]
这样的查询写法还是复杂了点,可以直接使用subset函数,那么查询会简单些,比如我们把查询条件改为年龄<30的女性,查姓名和年龄,那么查询语句为:
subset(student,Gender=="F" & Age<30 ,select=c("Name","Age"))