R语言学习-数据框

2024-07-17 23:36:31 浏览数 (1)

数据框

数据框创建

数据框类似矩阵,有行列两个维度。数据框允许不同的列可以包含不同的类型数据。注意数据框可以看成每个组将长度相同的列表。

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()函数操作

0 人点赞