(二)基本數(shù)據(jù)處理

數(shù)據(jù)集的導(dǎo)入

數(shù)據(jù)分析時(shí)大部分文件都是以特定分隔符分隔的,處理這類文件都可以使用read.table()函數(shù),將文件讀入為數(shù)據(jù)框凛篙。read.table()常用參數(shù)如下:

參數(shù) 描述
header 是否將文件首行作為數(shù)據(jù)框列名
row.names 用于指定行名稱
col.names 用于指定列名稱,使用此參數(shù)時(shí)需指定header=FALSE软吐,若header和col.names都未設(shè)置,則會(huì)自動(dòng)分配列名c(v1,v2,...)
sep 指定分隔符筒主,默認(rèn)為sep=""关噪,表示多個(gè)空格鸟蟹、tab乌妙、換行或回車
na.strings 用于表示缺失值得字符向量,如na.strings=c('-9','?')表示字符-9和建钥?在讀入時(shí)會(huì)自動(dòng)轉(zhuǎn)換成NA
colClasses 為每一列分配數(shù)據(jù)類型藤韵,如colClasses=c('numeric', 'character', 'bool', 'NULL')
quote 用于對有特殊字符的字符串劃定界限的字符串。默認(rèn)為"或'熊经。
skip 讀入數(shù)據(jù)時(shí)跳過的行泽艘,數(shù)據(jù)有頭注釋時(shí)比較有用
stringASFactors 邏輯變量,設(shè)置字符型數(shù)據(jù)是否轉(zhuǎn)換成因子镐依,默認(rèn)為TRUE匹涮,一般設(shè)置為FALSE。設(shè)置為FALSE時(shí)處理大文件時(shí)可以提高處理速度
text 指定要進(jìn)行處理的數(shù)據(jù)槐壳,若設(shè)置了text則file則應(yīng)留空

數(shù)據(jù)的基本處理

1然低、變量的創(chuàng)建以及重命名

變量創(chuàng)建直接使用<-即可,數(shù)據(jù)框的重命名可使用names()方法或colname()rowname()雳攘。
數(shù)據(jù)框中合并或者添加行列可使用cbind()带兜、rbind()或者功能更為強(qiáng)大的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包中有一個(gè)rename()函數(shù)可用于修改變量名刚照。

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 用于合并的兩個(gè)數(shù)據(jù)框;
by,by.x,by.y 指定依據(jù)哪些行合并數(shù)據(jù)框,默認(rèn)值為相同列名的列;
all,all.x,all.y 指定x和y的行是否應(yīng)該全在輸出文件;
sort by指定的列是否要排序;
suffixes 指定除by外相同列名的后綴;
incomparables 指定by中哪些單元不進(jìn)行合并.

2、缺失值處理

在任何數(shù)據(jù)中都可能由于各種原因出現(xiàn)缺失值(使用NA表示喧兄,Not Available)无畔,一般在處理數(shù)據(jù)之前需要對缺失值進(jìn)行處理。處理缺失值時(shí)需要注意兩點(diǎn):(1)缺失值是不可比較的吠冤,只能使用處理缺失值的函數(shù)進(jìn)行識(shí)別檩互,如is.na();(2)無限值(Inf)或者不能出現(xiàn)的值(NaN)不是以NA進(jìn)行表示咨演,識(shí)別這些值需要用到另外的方法闸昨,如is.infinite()is.nan()。此外薄风,含有缺失值得計(jì)算結(jié)果也為缺失值饵较。
大部分函數(shù)都會(huì)有一個(gè)na.rm=TRUE的參數(shù),可在計(jì)算前去除缺失值遭赂。
簡單的去除缺失值的行可使用na.omit()函數(shù)循诉。

> 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、變量的重編碼

重編碼涉及根據(jù)同一個(gè)變量和/或其他變量創(chuàng)建新值得過程撇他。例如將連續(xù)型變量修改為類別型變量茄猫,NA填補(bǔ)為平均值,基于 一組分?jǐn)?shù)線創(chuàng)建一個(gè)表示及格或者不及格的變量等困肩。

> 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
#一般不會(huì)直接在原變量上面進(jìn)行更改划纽,可在增加一個(gè)變量,這里為了方便直接在math在進(jìn)行了更改
> 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可使代碼更加簡潔锌畸,但是它沒有改變原來的數(shù)據(jù)
> 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勇劣、日期型數(shù)據(jù)

日期常異字符串的形式輸入到R中,可使用as.Date(x, input_format)將字符串轉(zhuǎn)化為日期變量潭枣。使用format(x,format="output_format")可指定日期的輸出格式比默。
R中的日期格式如下表:

符號 含義 示例
%d 數(shù)字表示的日期(0-31) 01-31
%a 縮寫的星期名 Mon
%A 非縮寫的星期名 Monday
%m 月份(00-12) 00-12
%b 縮寫的月份 Jan
%B 非縮寫的月份 January
%y 兩位數(shù)的年份 o8
%Y 四位數(shù)的年份 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、類型轉(zhuǎn)換

R中類型轉(zhuǎn)換函數(shù)如下表:

判斷 轉(zhuǎn)換
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盆犁、數(shù)據(jù)排序

可使用order()對一個(gè)數(shù)據(jù)框進(jìn)行排序命咐,默認(rèn)為升序。

> 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谐岁、數(shù)據(jù)選取子集

數(shù)據(jù)框的數(shù)據(jù)的選取既可以使用行列名進(jìn)行選取也可以通過索引進(jìn)行選取醋奠,還可以通過bool值進(jìn)行選任拖隆(如前面的例子中對NA值進(jìn)行重編碼),但是更推薦使用行列名進(jìn)行選取钝域。刪除某一列可使用"-"符號讽坏,但是這種方式只能對索引使用,對列名無法使用例证,且并未對原始數(shù)據(jù)進(jìn)行更改路呜,因此需要重新賦值。

> 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()可以更簡單的選擇所需要的數(shù)據(jù)织咧。

# 選擇英語成績高于80分且數(shù)學(xué)為A的行胀葱,保留的列為student和salary列
> subset(df,math>80 & math=="A", select=c(student,salary))
  student salary
1    john    100
2    jack    200

sample()函數(shù)用于(有放回或無放回抽樣)。

#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語言實(shí)戰(zhàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末笙蒙,一起剝皮案震驚了整個(gè)濱河市抵屿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捅位,老刑警劉巖轧葛,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異艇搀,居然都是意外死亡尿扯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門焰雕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衷笋,“玉大人,你說我怎么就攤上這事矩屁”僮冢” “怎么了?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵吝秕,是天一觀的道長泊脐。 經(jīng)常有香客問我,道長郭膛,這世上最難降的妖魔是什么晨抡? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任氛悬,我火速辦了婚禮则剃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘如捅。我一直安慰自己棍现,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布镜遣。 她就那樣靜靜地躺著己肮,像睡著了一般士袄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谎僻,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天娄柳,我揣著相機(jī)與錄音,去河邊找鬼艘绍。 笑死赤拒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的诱鞠。 我是一名探鬼主播挎挖,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼航夺!你這毒婦竟也來了蕉朵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤阳掐,失蹤者是張志新(化名)和其女友劉穎始衅,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缭保,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡觅闽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涮俄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛉拙。...
    茶點(diǎn)故事閱讀 40,146評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖彻亲,靈堂內(nèi)的尸體忽然破棺而出孕锄,到底是詐尸還是另有隱情,我是刑警寧澤苞尝,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布畸肆,位于F島的核電站,受9級特大地震影響宙址,放射性物質(zhì)發(fā)生泄漏轴脐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一抡砂、第九天 我趴在偏房一處隱蔽的房頂上張望大咱。 院中可真熱鬧,春花似錦注益、人聲如沸碴巾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厦瓢。三九已至提揍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間煮仇,已是汗流浹背劳跃。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浙垫,地道東北人售碳。 一個(gè)月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像绞呈,于是被迫代替她去往敵國和親贸人。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容