為了解決感興趣的問題,我們首先必須解決一些數(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é)
我們