数据集的导入
数据分析时大部分文件都是以特定分隔符分隔的,处理这类文件都可以使用read.table()
函数,将文件读入为数据框。read.table()
常用参数如下:
参数 | 描述 |
---|---|
header | 是否将文件首行作为数据框列名 |
row.names | 用于指定行名称 |
col.names | 用于指定列名称,使用此参数时需指定header=FALSE,若header和col.names都未设置,则会自动分配列名c(v1,v2,...) |
sep | 指定分隔符,默认为sep="",表示多个空格、tab、换行或回车 |
na.strings | 用于表示缺失值得字符向量,如na.strings=c('-9','?')表示字符-9和?在读入时会自动转换成NA |
colClasses | 为每一列分配数据类型,如colClasses=c('numeric', 'character', 'bool', 'NULL') |
quote | 用于对有特殊字符的字符串划定界限的字符串。默认为"或'。 |
skip | 读入数据时跳过的行,数据有头注释时比较有用 |
stringASFactors | 逻辑变量,设置字符型数据是否转换成因子,默认为TRUE,一般设置为FALSE。设置为FALSE时处理大文件时可以提高处理速度 |
text | 指定要进行处理的数据,若设置了text则file则应留空 |
数据的基本处理
1、变量的创建以及重命名
变量创建直接使用<-
即可,数据框的重命名可使用names()
方法或colname()
、rowname()
。
数据框中合并或者添加行列可使用cbind()
、rbind()
或者功能更为强大的merge()
方法。使用transform()
可使代码更加简洁。
> student<-c('john','jack','david','rose'); english<-c(90,82,88,67);math<-c(45,48,33,25);df<-data.frame(student,english,math);df
student english math
1 john 90 45
2 jack 82 48
3 david 88 33
4 rose 67 25
> df$art=c(18,16,19,7);df<-transform(df,age=rep(c(15,16),2));df
student english math art age
1 john 90 45 18 15
2 jack 82 48 16 16
3 david 88 33 19 15
4 rose 67 25 7 16
plyr包中有一个rename()
函数可用于修改变量名。
merge(x, y, by = intersect(names(x), names(y)),by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all, sort = TRUE, suffixes = c(".x",".y"), incomparables = NULL, ...)
x,y 用于合并的两个数据框;
by,by.x,by.y 指定依据哪些行合并数据框,默认值为相同列名的列;
all,all.x,all.y 指定x和y的行是否应该全在输出文件;
sort by指定的列是否要排序;
suffixes 指定除by外相同列名的后缀;
incomparables 指定by中哪些单元不进行合并.
2、缺失值处理
在任何数据中都可能由于各种原因出现缺失值(使用NA表示,Not Available),一般在处理数据之前需要对缺失值进行处理。处理缺失值时需要注意两点:(1)缺失值是不可比较的,只能使用处理缺失值的函数进行识别,如is.na()
;(2)无限值(Inf)或者不能出现的值(NaN)不是以NA进行表示,识别这些值需要用到另外的方法,如is.infinite()
和is.nan()
。此外,含有缺失值得计算结果也为缺失值。
大部分函数都会有一个na.rm=TRUE
的参数,可在计算前去除缺失值。
简单的去除缺失值的行可使用na.omit()
函数。
> df$salary <- c(100,200,NA,400);df
student english math art age salary
1 john 90 45 18 15 100
2 jack 82 48 16 16 200
3 david 88 33 19 15 NA
4 rose 67 25 7 16 400
> is.na(df)
student english math art age salary
[1,] FALSE FALSE FALSE FALSE FALSE FALSE
[2,] FALSE FALSE FALSE FALSE FALSE FALSE
[3,] FALSE FALSE FALSE FALSE FALSE TRUE
[4,] FALSE FALSE FALSE FALSE FALSE FALSE
> bonus<-c(50,50,50,50);df$total<-bonus+df$salary;df
student english math art age salary total
1 john 90 45 18 15 100 150
2 jack 82 48 16 16 200 250
3 david 88 33 19 15 NA NA
4 rose 67 25 7 16 400 450
> sum(df$salary)
[1] NA
> na.omit(df)
student english math art age salary total
1 john 90 45 18 15 100 150
2 jack 82 48 16 16 200 250
4 rose 67 25 7 16 400 450
3、变量的重编码
重编码涉及根据同一个变量和/或其他变量创建新值得过程。例如将连续型变量修改为类别型变量,NA填补为平均值,基于 一组分数线创建一个表示及格或者不及格的变量等。
> df$salary<-c(100,200,NA,400);df
student english math salary
1 john 90 45 100
2 jack 82 48 200
3 david 88 33 NA
4 rose 67 25 400
> df$math[df$math>40]<-'A';df$math[30<=df$math& df$math<=40]<-'B';df$math[df$math<300]<-'C';df
student english math salary
1 john 90 A 100
2 jack 82 A 200
3 david 88 B NA
4 rose 67 C 400
#一般不会直接在原变量上面进行更改,可在增加一个变量,这里为了方便直接在math在进行了更改
> within(df,salary[is.na(salary)]<-mean(salary,na.rm=TRUE))
student english math salary
1 john 90 A 100.0000
2 jack 82 A 200.0000
3 david 88 B 233.3333
4 rose 67 C 400.0000
#使用within可使代码更加简洁,但是它没有改变原来的数据
> df
student english math salary
1 john 90 A 100
2 jack 82 A 200
3 david 88 B NA
4 rose 67 C 400
> df$salary[is.na(df$salary)]<-mean(df$salary,na.rm=TRUE);df
student english math salary
1 john 90 A 100.0000
2 jack 82 A 200.0000
3 david 88 B 233.3333
4 rose 67 C 400.0000
4、日期型数据
日期常异字符串的形式输入到R中,可使用as.Date(x, input_format)
将字符串转化为日期变量。使用format(x,format="output_format")
可指定日期的输出格式。
R中的日期格式如下表:
符号 | 含义 | 示例 |
---|---|---|
%d | 数字表示的日期(0-31) | 01-31 |
%a | 缩写的星期名 | Mon |
%A | 非缩写的星期名 | Monday |
%m | 月份(00-12) | 00-12 |
%b | 缩写的月份 | Jan |
%B | 非缩写的月份 | January |
%y | 两位数的年份 | o8 |
%Y | 四位数的年份 | 2008 |
> mydates <- as.Date(c('2007-06-22','2007-06-23'),);mydates
[1] "2007-06-22" "2007-06-23"
> d<-as.Date(c('01/12/2008','02/10/2009'),'%m/%d/%Y');d
[1] "2008-01-12" "2009-02-10"
5、类型转换
R中类型转换函数如下表:
判断 | 转换 |
---|---|
is.numeric() | as.numeric() |
is.character() | as.character() |
is.vector() | as.vector() |
is.matrix() | as.matrix() |
is.data.frame() | as.data.frame |
is.factor() | as.factor() |
is.logical() | as.logical() |
> a<-c(1:5)
> is.numeric(a)
[1] TRUE
> as.character(a);a;is.character(a)
[1] "1" "2" "3" "4" "5"
[1] 1 2 3 4 5
[1] FALSE
6、数据排序
可使用order()
对一个数据框进行排序,默认为升序。
> df
student english math salary
1 john 90 A 100.0000
2 jack 82 A 200.0000
3 david 88 B 233.3333
4 rose 67 C 400.0000
# "-"表示降序排序
> df[order(-df$english,df$student),]
student english math salary
1 john 90 A 100.0000
3 david 88 B 233.3333
2 jack 82 A 200.0000
4 rose 67 C 400.0000
7、数据选取子集
数据框的数据的选取既可以使用行列名进行选取也可以通过索引进行选取,还可以通过bool值进行选取(如前面的例子中对NA值进行重编码),但是更推荐使用行列名进行选取。删除某一列可使用"-"符号,但是这种方式只能对索引使用,对列名无法使用,且并未对原始数据进行更改,因此需要重新赋值。
> df;df[c("salary","student")];df[c(4,1)];df[c(TRUE,FALSE,TRUE,FALSE)]
student english math salary
1 john 90 A 100.0000
2 jack 82 A 200.0000
3 david 88 B 233.3333
4 rose 67 C 400.0000
salary student
1 100.0000 john
2 200.0000 jack
3 233.3333 david
4 400.0000 rose
salary student
1 100.0000 john
2 200.0000 jack
3 233.3333 david
4 400.0000 rose
student math
1 john A
2 jack A
3 david B
4 rose C
> df[c(1,4),]
student english math salary
1 john 90 A 100
4 rose 67 C 400
> df[-4]
student english math
1 john 90 A
2 jack 82 A
3 david 88 B
4 rose 67 C
> df[df$english>80,]
student english math salary
1 john 90 A 100.0000
2 jack 82 A 200.0000
3 david 88 B 233.3333
使用subset()
可以更简单的选择所需要的数据。
# 选择英语成绩高于80分且数学为A的行,保留的列为student和salary列
> subset(df,math>80 & math=="A", select=c(student,salary))
student salary
1 john 100
2 jack 200
sample()
函数用于(有放回或无放回抽样)。
#replace=FALSE表示无放回抽样
> df
student english math salary
1 john 90 A 100.0000
2 jack 82 A 200.0000
3 david 88 B 233.3333
4 rose 67 C 400.0000
#无放回抽取三列
> df[sample(1:nrow(df), 3, replace=FALSE)]
english salary math
1 90 100.0000 A
2 82 200.0000 A
3 88 233.3333 B
4 67 400.0000 C
#无放回抽取三行
> df[sample(1:nrow(df), 3, replace=FALSE),]
student english math salary
3 david 88 B 233.3333
2 jack 82 A 200.0000
4 rose 67 C 400.0000
参考:
R语言实战