数据框
数据框创建
数据框类似矩阵,有行列两个维度。数据框允许不同的列可以包含不同的类型数据。注意数据框可以看成每个组将长度相同的列表。
x <-data.frame(1,2,3,4...),其中的列向量可为任何类型(字符型,数值型或者逻辑型)。
代码语言:r复制> mydata1 <- data.frame(name = c("李华","张三","玛丽"),"性别" = c("男","男","女"),age = c(18,19,23))
> #name,性别,age是列名
> mydata1
name 性别 age
1 李华 男 18
2 张三 男 19
3 玛丽 女 23 #数据框索引,和矩阵索引差不多,使用中括号进行索引
> mydata1[2]
性别
1 男
2 男
3 女
> class(mydata1[2])
[1] "data.frame"
> mydata1["name"] #使用列名索引,与列表,矩阵相同
name
1 李华
2 张三
3 玛丽
> mydata1[1,3]
[1] 18
> class(mydata1[2])
[1] "data.frame"
数据框的索引
数据框的索引与矩阵的索引差不多
1.索引一整个组件
¥使用一个中括号索引,中括号里写第几列序号
¥使用列名进行索引,与矩阵相同
¥使用$符号索引,与列表相同
代码语言:r复制> mydata1 <- data.frame(name = c("李华","张三","玛丽"),"性别" = c("男","男","女"),age = c(18,19,23))
> #name,性别,age是列名
> mydata1$性别
[1] "男" "男" "女"
> class(mydata1$性别)
[1] "character"
数据框有两个维度,可以返回多行多列的结果,具体操作方式与矩阵相同
数据框行列名的获取与更改
数据框行列名的读取与编辑有多种方式,这里介绍两种常用的
数据框列名的读取与更改
1.可以通过colnames(<数据框>)...或者colnames(数据框)
代码语言:r复制> mydata1 <- data.frame(name = c("李华","张三","玛丽"),"性别" = c("男","男","女"),age = c(18,19,23))
> #name,性别,age是列名
> colnames(mydata1)[1]
[1] "name"
> colnames(mydata1)[2]
[1] "性别"
> colnames(mydata1)
[1] "name" "性别" "age"
2.列名更改,colnames(数据框)...或者colnames(数据框) <-c(...)
代码语言:r复制> mydata1 <- data.frame(name = c("李华","张三","玛丽"),"性别" = c("男","男","女"),age = c(18,19,23))
> #name,性别,age是列名
> colnames(mydata1)[1] <- "报上名来"
> mydata1
报上名来 性别 age
1 李华 男 18
2 张三 男 19
3 玛丽 女 23
> colnames(mydata1)<-c("大名","b","cc")
> mydata1
大名 b cc
1 李华 男 18
2 张三 男 19
3 玛丽 女 23
3.数据框行名的读取与更改
使用row.names()函数进行操作
代码语言:r复制> mydata1 <- data.frame(name = c("李华","张三","玛丽"),"性别" = c("男","男","女"),age = c(18,19,23))
> #name,性别,age是列名
> row.names(mydata1)
[1] "1" "2" "3"
> row.names(mydata1)[1]
[1] "1"
> row.names(mydata1)[c(1,3)]
[1] "1" "3"
> row.names(mydata1)[c(1,3)] <- c("aa","cc")
> mydata1
name 性别 age
aa 李华 男 18
2 张三 男 19
cc 玛丽 女 23
数据框元素的增减
数据框元素的增加
和矩阵一样,也可以使用rbind()和cbind()函数添加行列,但是需要注意数据框使用rbind()时添加的行数据框还是列表
代码语言:r复制> mydata2 <- data.frame(name = c("李小华","张蜜桃","刘大灰"),"性别" = c("女","女","男"),age = c(18,19,23))
> #name,性别,age是列名
> mydata2
name 性别 age
1 李小华 女 18
2 张蜜桃 女 19
3 刘大灰 男 23
> hight <- c(175,176,179) #这里创建了一个身高的向量
> mydata3 <- cbind(mydata2,hight)
> mydata3
name 性别 age hight
1 李小华 女 18 175
2 张蜜桃 女 19 176
3 刘大灰 男 23 179
> m <- data.frame(name = c("一二"),"性别" = c("女"),age = c(18),hight=c(169))
> m
name 性别 age hight
1 一二 女 18 169
> n <- rbind(mydata3,m)
> n
name 性别 age hight
1 李小华 女 18 175
2 张蜜桃 女 19 176
3 刘大灰 男 23 179
4 一二 女 18 169
数据框元素的删除
删除的方式有很多种,但是方法与矩阵差不多
使用负索引
赋值NULL值
代码语言:r复制> n
name 性别 age hight
1 李小华 女 18 175
2 张蜜桃 女 19 176
3 刘大灰 男 23 179
4 一二 女 18 169
> mydata4 <- n[-2,]
> mydata4
name 性别 age hight
1 李小华 女 18 175
3 刘大灰 男 23 179
4 一二 女 18 169
> mydata4 <- n[-3,-3]
> mydata4
name 性别 hight
1 李小华 女 175
2 张蜜桃 女 176
4 一二 女 169
> mydata5 <- n
> mydata5[,2] <- NULL
> mydata5
name age hight
1 李小华 18 175
2 张蜜桃 19 176
3 刘大灰 23 179
4 一二 18 169
> mydata5[,"age"] <- NULL
> mydata5
name hight
1 李小华 175
2 张蜜桃 176
3 刘大灰 179
4 一二 169
数据框相关函数
基本与矩阵一致,好多函数都可以使用,这里举例apply和lapply函数
代码语言:r复制> mydata9 <- data.frame("c1"=c(1,3,5),"c2"= C(6,8,10),"c3"= c(13,15,17),"c4"= C(3,4,5))
Error in `contrasts<-`(`*tmp*`, how.many, value = contr) :
对比只适用于有两个或多于两个层次的因子
> mydata9
错误: 找不到对象'mydata9'
> rm(list = ls())
> mydata9 <- data.framedata.frame("n1" = c(1,2,3),"n2" = c(4,5,6),"n3" = c(18,19,23),"n4" = c(5,6,7))
Error in data.framedata.frame(n1 = c(1, 2, 3), n2 = c(4, 5, 6), n3 = c(18, :
没有"data.framedata.frame"这个函数
> rm(list = ls())
> rm(list = ls())
> u <- data.frame("n1" = c(1,2,3),"n2" = c(4,5,6),"n3" = c(18,19,23),"n4" = c(5,6,7))
> u
n1 n2 n3 n4
1 1 4 18 5
2 2 5 19 6
3 3 6 23 7
> u_mean <- apply(u,1, mean)#求对行均值
> da <- cbind(u,u_mean)
> da
n1 n2 n3 n4 u_mean
1 1 4 18 5 7.00
2 2 5 19 6 8.00
3 3 6 23 7 9.75
> r<- apply(da,2, mean) #求列均值
> mydata99<-rbind(da,r)
> mydata99
n1 n2 n3 n4 u_mean
1 1 4 18 5 7.00
2 2 5 19 6 8.00
3 3 6 23 7 9.75
4 2 5 20 6 8.25
#改个行名
> row.names(mydata99)[4] <- c("均值")
> mydata99
n1 n2 n3 n4 u_mean
1 1 4 18 5 7.00
2 2 5 19 6 8.00
3 3 6 23 7 9.75
均值 2 5 20 6 8.25
有时候数据框会转换为矩阵,可以使用as.matrix()函数操作