R语言-数据框

一、创建数据框

一个简单的例子:

> kids <- c("jack","jill")
> ages <- c(12,10)
> d <- data.frame(kids,ages,stringsAsFactors = FALSE)
> d
  kids ages
1 jack   12
2 jill   10

1、访问数据框

通过组件的索引值或者组件名来访问数据框的组件:

> d[[1]]
[1] "jack" "jill"
> d$kids
[1] "jack" "jill"

也可以通过类似矩阵的方式来访问

> d[,1] #查看第一列
[1] "jack" "jill"

用str()函数查看d的内部结构,可以看出d具有矩阵的特征

> str(d)
'data.frame':	2 obs. of  2 variables:
 $ kids: chr  "jack" "jill"
 $ ages: num  12 10

二、其他矩阵式操作

1、提取子数据框

数据框可以看作是行和列组成的,因此可以按行或列提取子数据框,如下:

> setwd("D:/R_files/code")
> examsquiz <- read.table("exams.txt",header = TRUE)
> head(examsquiz)
  Exam.1 Exam.2 Quiz
1    2.0    3.3  4.0
2    3.3    2.0  3.7
3    4.0    4.3  4.0
4    2.3    0.0  3.3
5    2.3    1.0  3.3
6    3.3    3.7  4.0
> examsquiz[2:5,]
  Exam.1 Exam.2 Quiz
2    3.3    2.0  3.7
3    4.0    4.3  4.0
4    2.3    0.0  3.3
5    2.3    1.0  3.3
> examsquiz[2:5,2]
[1] 2.0 4.3 0.0 1.0
> class(examsquiz[2:5,2])
[1] "numeric"
> examsquiz[2:5,2,drop=FALSE]
  Exam.2
2    2.0
3    4.3
4    0.0
5    1.0
> class(examsquiz[2:5,2,drop=FALSE])
[1] "data.frame"

在此例中,因为examsquiz[2:5,2]是向量,R会创建一个向量而不是另一个数据框,设定参数drop=FALSE,可以得到一个一列的数据框
也可以对此做筛选:

> examsquiz[examsquiz$Exam.1>=3.8]
  Quiz
1  4.0
2  3.7
3  4.0
4  3.3
5  3.3
6  4.0

2、缺失值的处理

一个小例子:

> x <- c(2,NA,4)
> mean(x)
[1] NA
> mean(x,na.rm = TRUE)
[1] 3

可以使用subset()函数,可以不用自己设定na.rm=TRUE,可以把它应用在数据框上来选择行,列名称将从给定数据框中获取

> head(examsquiz)
  Exam.1 Exam.2 Quiz
1    2.0    3.3  4.0
2    3.3    2.0  3.7
3    4.0    4.3  4.0
4    2.3    0.0  3.3
5    2.3    1.0  3.3
6    3.3    3.7  4.0
> examsquiz[examsquiz$Exam.1 >= 3.8,]
  Exam.1 Exam.2 Quiz
3      4    4.3    4
> subset(examsquiz,Exam.1 >= 3.8)
  Exam.1 Exam.2 Quiz
3      4    4.3    4
> subset(examsquiz,examsquiz$Exam.1>=3.8)
  Exam.1 Exam.2 Quiz
3      4    4.3    4

可以看出来结果都是一样的
在有些情况下,希望从数据框中去掉含有一个以上缺失值NA的观测,这时候看complete.cases()函数比较方便

> KID <- read.table("kids.txt",header = TRUE)
> KID
     kids states
1    Jack     CA
2    <NA>     MA
3 Jillian     MA
4    John   <NA>
> complete.cases(KID)
[1]  TRUE FALSE  TRUE FALSE
> KID1 <- KID[complete.cases(KID),]
> KID1
     kids states
1    Jack     CA
3 Jillian     MA

3、使用rbind()和cbind()等函数

矩阵函数rbind()和cbind()也同样可以应用于数据框,前提是两个数据框有相同的行数或者列数

  • 用rbind()添加新行的时候,添加的行通常是数据框或者列表的形式:
> kids <- c("jack","jill")
> ages <- c(12,10)
> d <- data.frame(kids,ages,stringsAsFactors = FALSE)
> d
  kids ages
1 jack   12
2 jill   10
> rbind(d,list("lau",19))
  kids ages
1 jack   12
2 jill   10
3  lau   19

也可以用原来得列创建新的列,例如,增加一个表示第一门与第二门考试成绩之差得变量:

> head(examsquiz)
  Exam.1 Exam.2 Quiz
1    2.0    3.3  4.0
2    3.3    2.0  3.7
3    4.0    4.3  4.0
4    2.3    0.0  3.3
5    2.3    1.0  3.3
6    3.3    3.7  4.0
> eq <- cbind(examsquiz,examsquiz$Exam.2-examsquiz$Exam.1)
> class(eq)
[1] "data.frame"
> head(eq)
  Exam.1 Exam.2 Quiz examsquiz$Exam.2 - examsquiz$Exam.1
1    2.0    3.3  4.0                                 1.3
2    3.3    2.0  3.7                                -1.3
3    4.0    4.3  4.0                                 0.3
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

可以看到新变量的名称过于笨拙了,可以用names()函数修改变量名称,不过最好利用数据框的列表属性,用下面的方式给原来的数据框添加一个长度相同的新列:

> examsquiz$ExamDiff <- examsquiz$Exam.2-examsquiz$Exam.1
> head(examsquiz)
  Exam.1 Exam.2 Quiz ExamDiff
1    2.0    3.3  4.0      1.3
2    3.3    2.0  3.7     -1.3
3    4.0    4.3  4.0      0.3
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

数据框也可以进行循环补齐,可以向数据框添加长度不同的列:

> kids <- c("jack","jill")
> ages <- c(12,10)
> d <- data.frame(kids,ages,stringsAsFactors = FALSE)
> d
  kids ages
1 jack   12
2 jill   10
> d$one <- 1
> d
  kids ages one
1 jack   12   1
2 jill   10   1

4、使用apply()

如果数据框的每一列的数据类型相同,则可以会数据框使用apply()函数

> apply(examsquiz,1,max)
[1] 4.0 3.7 4.3 3.3 3.3 4.0

三、合并数据框

合并:两张表根据某个共同变量的值组合到一起
最简单的形式:merge(x,y)

> kids <- c("Jack","Jill","Jillian","John")
> states <- c("CA","MA","MA","HI")
> d1 <- data.frame(kids,states,stringsAsFactors = FALSE)
> d1
     kids states
1    Jack     CA
2    Jill     MA
3 Jillian     MA
4    John     HI
> kids <- c("Jill","Lillian","Jack")
> ages <- c(10,7,12)
> d2 <- data.frame(kids,ages,stringsAsFactors = FALSE)
> d2
     kids ages
1    Jill   10
2 Lillian    7
3    Jack   12
> d <- merge(d1,d2)
> d
  kids states ages
1 Jack     CA   12
2 Jill     MA   10

这两个数据框都有变量kids,R在两个数据框里查找kids变量值相同的行,再用查找到的行和两个数据框里的所有列然后创建新的数据框

  • 函数merge()有两个参数by.x和by.y,用于标示出两个数据框里含有相同信息但名称不同的两个变量
> ages <- c(10,7,12)
> pals <- c("Jill","Lillian","Jack")
> d3 <- data.frame(pals,ages,stringsAsFactors = FALSE)
> d3
     pals ages
1    Jill   10
2 Lillian    7
3    Jack   12
> merge(d1,d3,by.x="kids",by.y = "pals")
  kids states ages
1 Jack     CA   12
2 Jill     MA   10

四、应用于数据框的函数

1、在数据框上应用lappply()和sapply()函数

数据框是列表的特例,数据框的列构成了列表的组件。在数据框上应用lapply()函数,指定函数是f()。f()函数会作用于数据框的每一列,然后将返回值置于一个列表中。

> kids <- c("jack","jill")
> ages <- c(12,10)
> d <- data.frame(kids,ages,stringsAsFactors = FALSE)
> d
  kids ages
1 jack   12
2 jill   10
> dl <- lapply(d,sort)
> dl
$kids
[1] "jack" "jill"

$ages
[1] 10 12

dl是由两个向量构成的列表,这两个向量是排序后的kids和ages
but,dl现在只是列表,而不是数据框,可以把它强制转化为数据框:

> as.data.frame(dl)
  kids ages
1 jack   10
2 jill   12
  • 1
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值