创建数据框
kids <- c("jack","jill")
ages <- c(12,10)
#不让字符向量转换为因子
d <- data.frame(kids,ages,stringsAsFactors = F)
d```
#数据框也可以看成一种列表,所以有以下访问方式
d[["kids"]]
d[[1]]
d$kids
也可以使用矩阵的形式访问
d[,1]
str()查看d的内部结构
str(d)
表示两个观测存储于两个变量之中```
读取文件数据table format
examsquiz <- read.table("exams",header = T)
#read.table() reads a file in table format and creates a data frame from it```
exam1 <- c(2.0,3,4,2.3,2.3,3.3)
exam2 <- c(3.3,2.0,4.0,0.0,1.0,3.7)
Quiz <- c(4.0,3.7,4.0,3.3,3.3,4.0)
d <- data.frame(exam1,exam2,Quiz)```
提取子数据框,类似于矩阵操作
#按行提取子数据框
d[2:5,]
d[2:5,2]
#上面一条命令由于提取出来是向量,R会自己创建一个向量而不是数据框
#使用drop=F可以得到一个数据框
d[2:5,2,drop=F]
#做筛选,选出第一个变量大于3的所有行,注意筛选语句后面有,表示取行
d[d$exam1 > 3,]
#d$exam1 > 3返回的是一个logical型的向量,而d[]将其作为参数会把值为TRUE的作为索引```
#缺失值的处理
设置na.rm=T来使R忽略缺失值
x <- c(2,NA,4)
mean(x)
mean(x,na.rm = T)
subset()函数默认已经指定na.rm=T所以直接可以处理掉缺失值
subset(x,x>1)
对于数据框
subset(d,exam1>3)
有些情况需要从数据框去掉一个或者以上的缺失值的观测
使用complete.cases()函数
kids <- c("jack",NA,"jillian","john")
states <- c("CA","MA","MA",NA)
d1 <- data.frame(kids,states)
complete.cases(d1)
选取完整的行
d1[complete.cases(d1),]```
使用cbind()和rbind()函数
#rbind()添加新行,添加的行通常是数据框或者列表
rbind(d,list("laura",19))
#cbind()添加新列,要求新列和原有的列长度相同
#但是可以通过循环补齐,添加长度不同的列
d$age <- 1
#使用原有的列添加新列
eq <- cbind(d,Quiz-exam2)
#添加的变量名太长,使用names()来修改变量名
names(eq)[5] <- "diff"
#或者这样来新建一个列
d$examdiff <- d$exam2 - d$exam1```
#apply()函数
对数据框的每一行(1表示每一行)使用max函数,求出每一个观测的最大值
apply(d,1,max)```
合并数据框
#根据两张表的共同变量的值组合到一起
kids <- c("jack","jill","jillian","john")
states <- c("MA","CA","MA","HI")
d1 <- data.frame(kids,states)
ages <- c(10,7,12,21)
d2 <- data.frame(kids,ages)
#根据相同变量kids将两个数据框合并到一起
#并且两个数据框相同变量的值相同的行才会合并到一起
d <- merge(d1,d2)
#merge()有by.x和by.y参数,标示出两个数据框里含有相同信息但是名称不同的两个变量
pals <- kids
ages <- c(12,10,7,3)
d3 <- data.frame(pals,ages)
#by.x指定前面的数据框中的列名,字符串
#by.y指定后面的数据框中的列名,字符串
merge(d1,d3,by.x = "kids",by.y = "pals")```
#应用于数据框的函数
lapply()函数里面的f()函数会作用于数据框的每一列
数据框是列表的特例,然后作用于列表是作用于每一个组件
返回值是在一个列表上,sapply()返回一个数据框
d1 <- lapply(d,sort)
返回的数据框字符串是排序好的索引值
d2 <- sapply(d,sort)```