(二)基本数据处理

数据集的导入

数据分析时大部分文件都是以特定分隔符分隔的,处理这类文件都可以使用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语言实战

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容