r語言實戰(zhàn) 第四章

為了解決感興趣的問題,我們首先必須解決一些數(shù)據(jù)管理方面的問題菱涤。

4.2 ?創(chuàng)建新變量

在典型的研究項目中苞也,你可能需要創(chuàng)建新變量或者對現(xiàn)有變量進行轉(zhuǎn)換。這可以通過以下形式的的語句來完成:

變量名←表達式

以上語句中“表達式”部分可以包含多種運算符和函數(shù)粘秆。算數(shù)運算符可以用于構(gòu)造公式(formula)如迟。

表4-2 ? ?算數(shù)運算符

運算符 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?描述

+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?加

- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 減

* ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 乘

/ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 除

︿或** ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?求冥

x%%y ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?求余(x mod y).5%%2的結(jié)果為2


假設(shè)你有一個名為mydata的數(shù)據(jù)框,其中一個變量為x1和x2攻走,現(xiàn)在你想創(chuàng)建一個新變量sumx存儲以上兩個變量的加和殷勘,并創(chuàng)建一個名為meanx的新變量存儲這兩個變量的均值。以上代碼清單提供了三種不同的方式實現(xiàn)這個目標昔搂,具體選擇自己決定玲销,本書作者傾向于第三種方式,即transform()函數(shù)的一個示例巩趁。這種方式簡化了按需創(chuàng)建新變量并將其保存到數(shù)據(jù)框的過程痒玩。


reshape包擁有一系列強大的數(shù)據(jù)集結(jié)構(gòu)修改函數(shù),最后议慰,可以通過names()函數(shù)來重命名變量蠢古,以上代碼中將date重命名為testDate。

4.5 ? ?缺失值

在r中别凹,缺失值以符號NA(Not Available,不可用)表示炉菲。不可能出現(xiàn)的值(例如,被0除的結(jié)果)通過符號NaN(Not a Number嘱丢,非數(shù)值)來表示越驻。與SAS等程序不同缀旁,r中字符型和數(shù)值型數(shù)據(jù)使用的缺失值符號是相同的并巍。

r提供了一些函數(shù)刽射,用于識別包含缺失值的觀測距贷。函數(shù)is.na()允許你檢測缺失值是否存在忠蝗。假設(shè)你有一個向量:

y <- c(1, 2, 3, NA)

然后使用函數(shù)

is.na(y)

將返回c(FALSE,FALSE,FALSE,TRUE).



這里的leadership[, 6:10]將數(shù)據(jù)框限定到第6列至第10列速种,接下來is.na()識別出了缺失值配阵。

4.5.1重編碼某些值為缺失值

如同4.3節(jié)中演示的那樣棋傍,你可以使用賦值語句將某些重編碼為缺失值瘫拣。在我們的leadership示例中麸拄,缺失的年齡值被編碼為99.在分析這一數(shù)據(jù)集之前,你必須讓r明白本例中的99表示缺失值蒂萎。你可以通過重編碼這個變量完成這項工作

leadership$age[leadefship$age == 99] <- NA

任何等于99的年齡值都將被修改為NA.

4.5.2 ? 在分析中排除缺失值

確定了缺失值的位置以后五慈,你需要進一步分析數(shù)據(jù)之前以某種方式刪除這些缺失值豺撑。原因是聪轿,含有缺失值的算術(shù)表達式和函數(shù)的計算結(jié)果也是缺失值陆错。



由于x中的第三個元素是缺失值音瓷,所以y和z也都是NA(缺失值)绳慎。

好在多數(shù)函數(shù)都擁有一個na.rm=TRUE選項杏愤,可以在計算之前移除缺失值并用剩余值進行計算:

x <- c(1, 2, NA, 3)

y <- sum(x, na.rm=TRUE)

這里珊楼,y等于6

在使用函數(shù)處理不完整的數(shù)據(jù)時厕宗,請務(wù)必查閱他們的幫助文檔(例如已慢,help(sum))蛇受,檢查這些函數(shù)是如何處理缺失數(shù)據(jù)的兢仰。

你可以通過函數(shù)na.omit()移除所有含缺失值的觀測把将。na.omit()可以刪除所有含有缺失數(shù)據(jù)的行察蹲。

代碼清單4-4 ? ?使用na.omit()移除所有含缺失值的觀測。


在結(jié)果被保存到newdata之前,所有包含缺失數(shù)據(jù)的行均已從leadership中刪除亚兄。

刪除所有含有缺失數(shù)據(jù)的觀測(成為行刪除审胚,list deletion)是處理不完整數(shù)據(jù)集的若干手段之一膳叨。

4.6 ?日期值

日期值通常以字符串的形式輸入到R中饿自,然后轉(zhuǎn)化為以數(shù)值的形式存儲的日期變量璃俗。函數(shù)as.date()用于執(zhí)行這種轉(zhuǎn)化。其語法為as.Date(x,"input_format"),其中x是字符型數(shù)據(jù)苟穆,input-format則給出了用于讀入日期的適當格式

符號 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?含義 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 示例

%d ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 數(shù)字表示的日期 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 01~31

%a ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 縮寫的星期名 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Mon

%A ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 非縮寫星期名 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Monday

%m ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?月份(00~12) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?00~12

%b ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 縮寫的月份 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Jan

%B ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 非縮寫的月份 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?January

%y ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?兩位數(shù)的年份 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?07

%y ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 四位數(shù)的年份 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2007

日期值得默認輸入格式為yyyy-mm-dd跟磨。

語句:

mydates <- as.Date(c("2007-06-22", "2004-02-13"))

將默認格式的字符型數(shù)據(jù)轉(zhuǎn)換為了對應(yīng)日期抵拘。相反僵蛛,

steDates <- c("01/05/1965","08/16/1975")

dates <- as.date(strDates,"%m/%d/%y")

則使用mm/dd/yyyy的格式讀取數(shù)據(jù)。

有兩個函數(shù)對于處理時間戳數(shù)據(jù)特別實用飘言。Sys.Date()可以返回當天的日期姿鸿,而date()則返回當前的日期和時間苛预。我寫下這段文字的時間是2010年12月1日下午4:28.所以執(zhí)行這些函數(shù)的結(jié)果是:


你可以使用函數(shù)format(x热某,format=“output-fomat”)來輸出指定格式的日期值苫拍,并且可以提取日期值中的某些部分:


format()函數(shù)可接受一個參數(shù)(本例中是一個日期)并按某種格式輸出結(jié)果(本例中使用了表4-4中符號的組合)。

R的內(nèi)部在存儲日期時蔬捷,是使用自1970年1月1日以來的天數(shù)表示的周拐,更早的日期則表示為負數(shù)妥粟。這意味著可以在日期值上執(zhí)行算術(shù)運算勾给。例如:


顯示了2004年2月13日和2011年1月22日之間的天數(shù)脓钾。

最后可训,也可以使用函數(shù)difftime()來計算時間間隔,并以星期飞崖、天蚜厉、時昼牛、分贰健、秒來表示伶椿。

假設(shè)我出生于1981年12月20日脊另,我現(xiàn)在有多大了呢偎痛?



4.6.1 ? 將日期轉(zhuǎn)換為字符型變量

函數(shù)as.character()可將日期值轉(zhuǎn)換為字符型:strDates <- as.character(dates)

進行轉(zhuǎn)換后踩麦,即可使用一系列字符處函數(shù)處理數(shù)據(jù)理

4.6.2 ?更進一步

4.7 ? 類型轉(zhuǎn)換

你可以使用表4-5中列出的函數(shù)來判斷數(shù)據(jù)的類型或者將其轉(zhuǎn)換為指定類型谓谦。

表4-5 ? ?類型轉(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.date.frame()

is.factor() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? as.factor()

is.logical() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? as.logical()

名為is.datatype()這樣的函數(shù)返回TRUE或FALSE,而as.datatype()這樣的函數(shù)則將其參數(shù)轉(zhuǎn)換為對應(yīng)的類型反粥。

代碼清單4-5提供了一個示例

代碼清單4-5 ? 轉(zhuǎn)換數(shù)據(jù)類型


4.8 ? 數(shù)據(jù)排序

在R中星压,可以使用order()函數(shù)對一個數(shù)據(jù)框進行排序。默認的排序順序是升序逊脯。在排序變量的前邊加一個減號即可得到降序的排序結(jié)果。一下示例使用leadership演示了數(shù)據(jù)框的排序演怎。

語句:


本章問題1:為什么使用attach(leadership)會出現(xiàn)以上的錯誤,這樣的問題已經(jīng)一再出現(xiàn)了拍皮,基本只要使用attach()就會出現(xiàn)以上類似的提示?咆耿?萨螺?慰技?吻商?手报?改化?陈肛?

4.9 ?數(shù)據(jù)集的合并

如果數(shù)據(jù)分散在多個地方句旱,你就需要在繼續(xù)下一步之前將其合并。

4.9.1 ?添加列

要橫向合并兩個數(shù)據(jù)框(數(shù)據(jù)集)請使用merge()函數(shù)腥泥。在多數(shù)情況下蛔外,兩個數(shù)據(jù)框是通過一個或多個共有變量進行聯(lián)結(jié)的(即一種內(nèi)聯(lián)結(jié)夹厌,innerjoin)矛纹。例如:


注意 ? 如果要直接橫向合并兩個矩陣或數(shù)據(jù)框或南,并且不需要指定一個公共索引迎献,那么可以直接使用cbind()函數(shù):

total <- cbind(A, B)

這個函數(shù)將橫向合并對象A和對象B.為了讓它正常工作,每個對象必須擁有相同的行數(shù)扒秸,且要以相同順序排序伴奥。

4.9.2 ?添加行

要縱向合并兩個數(shù)據(jù)框(數(shù)據(jù)集)翼闽,請使用rbind()函數(shù):

total <- rbind(datafameA,dataframeB)

兩個數(shù)據(jù)框必須擁有相同的變量感局,不過它們的順序不必一定相同。如果dataframeA中擁有dataframeB中沒有的變量崖瞭,請在合并他們之前做以下某種處理:

书聚。刪除dataframeA中的多余變量

雌续。在dataframeB中創(chuàng)建追加的變量并將其值設(shè)為NA(缺失)

縱向聯(lián)結(jié)通常用于向數(shù)據(jù)框中添加觀測驯杜。

4.10 ? 數(shù)據(jù)集取子集

4.10.1 ? 選入(保留)變量

從一個大數(shù)據(jù)集中選擇有限數(shù)量的變量來創(chuàng)建一個新的數(shù)據(jù)集是常有的事艇肴。在第二章中,數(shù)據(jù)框中的元素是通過dataframe[row ? indices, column indices]這樣的記號來訪問的。你可以沿用這種方法來選擇變量:


實現(xiàn)了等價的變量選擇冲九。這里莺奸,(引號中的)變量名充當了列的下標灭贷,因此選擇的列是相同的。

最后逃延,其實你可以寫:


本例使用paste()函數(shù)創(chuàng)建了與上例中相同的字符型向量讽膏。

4.10.2 ? ?剔除(丟棄)變量

剔除變量的原因有很多府树。舉例來說料按,如果某個變量中有若干缺失值遭铺,你可能就想在進一步分析之前將其丟棄。下面是一些剔除變量的方法魂挂。


為了理解以上語句的原理,你需要把它拆解如下敏沉。

1、names(leadership)生成了一個包含所有變量名的字符型向量:

c(“managerID","testDate”潦闲,“country”歉闰,“gender”和敬,“age”昼弟,“q1”,“q2”衰粹,“q3”铝耻,“q4”瓢捉,“q5”)泡态。

2.names(leadership) %in%c(“q3”某弦, “q4”)返回了一個邏輯型向量靶壮,names(leadership)中每個匹配q3或q4的元素的值為TRUE,反之為FALSE:c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,FALSE, TRUE, TRUE, FALSE).

3.運算符非(!)將邏輯值反轉(zhuǎn):c(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE).


4.leadership[c(TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,FALSE,FALSE,TRUE)]選擇了邏輯值為TRUE的列螃壤,于是q4和q4被剔除了抗果。

在知道了q3和q4是第8個和第9個變量的情況下,可以使用語句:

newdata <- leadership[c(-8, -9)]

將它們剔除奸晴。這種方式的工作原理是冤馏,在某一列的下標之前加一個減號(?)就會剔除那一列。

末了寄啼,相同的變量刪除工作亦可通過:

leadership$q3 <- leadership$q4 <- NULL

來完成宿接。這回你將q3和q4兩列設(shè)為了未定義(NULL).注意,NULL與NA(表示缺失是不同的辕录。丟棄變量是保留變量的逆向操作。選擇哪一種方式進行變量篩選依賴于兩種方式的編碼難易程度域蜗。如果有許多變量需要丟棄韵丑,那么直接保留需要的留下的變量可能更簡單塞绿,反之亦然喜庞。

4.10.3 ? ?選入觀察

選入或剔除觀測(行)通常是成功的數(shù)據(jù)準備和數(shù)據(jù)分析的一個關(guān)鍵方面。

代碼清單4-6 ? ? 選入觀測


在本章開始的時候,我曾經(jīng)提到,你可能希望將研究的范圍限定在2009年1月1日到2009年12月31日之間的收集的觀測上。

leadership$date <- as.Date(leadership$date, "%m/%d/%y")

startdate <- as.Date("2009-01-01")

enddate <- as.Date("2009-10-31")

?<- leadership[which(leadership$date >=stardate &

leadership$date <= enddate),]

首先扁位,使用格式mm/dd/yy將開始作為字符值讀入的日期轉(zhuǎn)換為日期值暇务。然后創(chuàng)建開始日期和結(jié)束日期。由as.Date()函數(shù)的默認格式就是yyyy-mm-dd,所以你必須在這里提供這個參數(shù)。

4.10.4 ?subset()函數(shù)

前兩節(jié)中的示例很重要,因為他們輔助描述了邏輯型向量和比較運算符在R中的解釋方式。


???上面出現(xiàn)了“select=c(q1,q2,q3,q4))彈出了上圖最后一列的問題是上面原因,我的猜想是之前的記錄中沒有輸入相關(guān)數(shù)據(jù)详幽,導(dǎo)致后面找不到?

在第一個示例中,你選擇了所有age的值大于或等于35或age值小于24的行控乾,保留了變量q1到q4.在第二個示例中,你選擇了所有25歲以上的男性蒜绽,并保留了變量gender到q4(gender相赁、q4和其間所有列)绵脯。

4.10.5 ?隨機抽樣

sample()函數(shù)能夠讓你從數(shù)據(jù)集中(有放回或無放回地)抽取大小為n的一個隨機樣本。

你可以使用以下語句從leadership數(shù)據(jù)集中隨機抽取一個大小為3的樣本:

mysample <- leadership[sample(1:nrow(leadership), 3, replace=FALSE),]

sample()函數(shù)中的第一個參數(shù)是一個要從中抽樣的元素組成的向量。在這里,這個向量是1到數(shù)據(jù)框中觀測的數(shù)量,第二個參數(shù)是要抽取的元素數(shù)量,第三個參數(shù)表示無法取回抽樣。

sample()函數(shù)會返回隨機抽樣得到的元素砂豌,之后即可用于選擇數(shù)據(jù)框中的行筐摘。

4.11 ?使用SQL語句操作數(shù)據(jù)框

4.12 ? 小結(jié)

我們

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市张惹,隨后出現(xiàn)的幾起案子宛逗,更是在濱河造成了極大的恐慌驻粟,老刑警劉巖沃饶,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勤讽,死亡現(xiàn)場離奇詭異,居然都是意外死亡叉庐,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來裁眯,“玉大人骤菠,你說我怎么就攤上這事抹凳。” “怎么了强缘?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵叮趴,是天一觀的道長。 經(jīng)常有香客問我,道長震檩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任静檬,我火速辦了婚禮巴柿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘糠聪。我一直安慰自己狸棍,他們只是感情好丙猬,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伟墙,像睡著了一般就乓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拱烁,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天生蚁,我揣著相機與錄音,去河邊找鬼戏自。 笑死邦投,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的擅笔。 我是一名探鬼主播志衣,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼猛们!你這毒婦竟也來了念脯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤阅懦,失蹤者是張志新(化名)和其女友劉穎和二,沒想到半個月后徘铝,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耳胎,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡惯吕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了怕午。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片废登。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖郁惜,靈堂內(nèi)的尸體忽然破棺而出堡距,到底是詐尸還是另有隱情,我是刑警寧澤兆蕉,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布羽戒,位于F島的核電站,受9級特大地震影響虎韵,放射性物質(zhì)發(fā)生泄漏易稠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一包蓝、第九天 我趴在偏房一處隱蔽的房頂上張望驶社。 院中可真熱鬧,春花似錦测萎、人聲如沸亡电。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽份乒。三九已至,卻和暖如春零酪,著一層夾襖步出監(jiān)牢的瞬間冒嫡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工四苇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留孝凌,地道東北人。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓月腋,卻偏偏與公主長得像蟀架,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子榆骚,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

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