2.1數據集的概念
變量的類型是不同的,比如標示符、日期變量、連續變量、名義變量、有序型變量等,記得數據挖掘導論中有專門的描述。
R可以處理的數據類型包括了數值型、字符型、邏輯型、復數型(虛數)、原生型(字節)。
2.2數據結構
R擁有很多存儲數據的對象類型,包括 標量、向量、矩陣、數組、數據框、列表。它們可以用下圖表示:
因子是R中的名義型或者有序型變量,比較特殊。
2.2.1向量
標量是只有一個元素的向量,一般用來保存常量。其他沒什么說的。
seq函數:
seq(from = 1, to = 1, by = ((to - from)/(length.out - 1)), length.out = NULL, along.with = NULL, ...) #by是增量,length.out是序列長度,along.with后面接一個向量,表明 #按照這個向量長度按照平均間隔生成一個序列
2.2.2矩陣
矩陣創建函數:
matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE , # 注意默認按列進行填充 dimnames = NULL or(dimnames = list(rowname,colname))
關於矩陣的各種運算法則,書上沒寫,自己也不怎么會,因為用的不多現在,用的時候看就行了,網上一堆。
2.2.3數組
貌似自己用到的不多,array函數:
array(data = NA, dim = length(data), dimnames = NULL)
#data是填充向量,dim是維數向量,dimnames是名稱
記得有個函數是用來對行或者列進行邊際求和的,margin.table等,用的時候自行百度吧再。
2.2.4數據框
書上說這是最常用的數據類型了,確實用的比較多。數據框創建函數data.frame:
data.frame(..., row.names = NULL, check.rows = FALSE, check.names = TRUE, stringsAsFactors = default.stringsAsFactors()) #check.rows 用來檢查行的名稱和數量是否一致,check.names 來檢查變量(列)的名稱是否唯一且符合語法,最后一項是用來描述是否將字符型向量自動轉換為因子,默認轉換,改變的話stringsAsFactors = FALSE即可。
注意數據框也是按列生成,每一列的數據類型必須一致。
好吧……看到了數據框的下標引用,自己試了試,發現一個trick,見下圖:
上面的是一個數據框,請看下面的實驗:
可以看出,數據框后面引用一個數字,代表直接引用了第幾列,得到數據框;按照矩陣的方式去引用列的話,得到的是一個向量!!而用矩陣的方式引用行,得到的是數據框。R語言經常碰到這樣的蛋疼情況,要十分注意。當然可以用$符號+列名引用某列(ps.中文狀態下4的上面是¥,美元換成人民幣…).
下面是幾個函數,沒用過。學一下:
1、attach和detach函數
成對使用。attach可以將數據框加入R的搜索路徑中,簡化代碼,而detach將數據框從路徑中移除。比如:
注意,當環境中有重名的變量時,原來變量為主。所以,這倆函數應用在名稱特殊一點的數據框比較合適。
2、with函數
這個函數好像很常用,但是一直沒用過:
with是一個很強大的函數,強大到,參數好像很隨意
Description Evaluate an R expression in an environment constructed from data, possibly modifying (a copy of) the original data. Usage with(data, expr, ...) within(data, expr, ...) Arguments data data to use for constructing an environment. For the default with method this may be an environment, a list, a data frame, or an integer as in sys.call. For within, it can be a list or a data frame. #我理解為一種環境吧,在一種環境中進行某種操作 expr expression to evaluate.#進行的操作 ... arguments to be passed to future methods.
一點一點學,碰到就學吧。書上例子比較明了:
下面的例子涉及到了 <<- 這個運算符,記得在聽公開課的時候講R作用域的時候聽到過。這個運算符只在函數中使用,用來跳出現在的函數,在上一層的環境中為一個變量賦值。好吧,r作用域問題比較糾結。話說回來,還是不要用<<-這種運算符為好,太復雜和混亂了。
實例標識符,唯一標識一條數據觀測值,data.frame()函數有參數row.names可以指定實例標識符。
2.2.5 因子
R語言中名義和順序變量稱為因子。因子非常重要,因為它決定了R中數據分析方式和如何進行視覺呈現。若用向量生成因子,R中存儲的是數字向量,並且將數字與相異值相關聯。
factor()函數中有一個參數ordered,若為TRUE,則生成的因子是有序因子,有序和無需因子在進行統計處理的時候是不一樣對待,現在還體會不到。
factor(x = character(), levels, labels = levels, exclude = NA, ordered = is.ordered(x), nmax = NA) # x a vector of data, usually taking a small number of distinct values. levels #用來人為規定水平的對應情況 an optional vector of the values (as character strings) that x might have taken. The default is the unique set of values taken by as.character(x), sorted into increasing order of x. Note that this set can be specified as smaller than sort(unique(x)). labels either an optional character vector of labels for the levels (in the same order as levels after removing those in exclude), or a character string of length 1. exclude #某些量不作為水平 a vector of values to be excluded when forming the set of levels. This should be of the same type as x, and will be coerced if necessary. ordered logical flag to determine if the levels should be regarded as ordered (in the order given). nmax an upper bound on the number of levels; see ‘Details’. ... (in ordered(.)): any of the above, apart from ordered itself. ifany (only add an NA level if it is used, i.e. if any(is.na(x)).
這里面的好多參數沒有接觸過。下面把書上的代碼碼一遍:
patientID <- c(1,2,3,4) age <- c(25,34,28,52) diabetes <- c("Type1","Type2","Type1","Type1") status <- c("Poor","Improved","Excellent","Poor") diabetes <- factor(diabetes) status <- factor(status,ordered = TRUE) patientdata <- data.frame(patientID,age,diabetes,status) str(patientdata) summary(patientdata)
上面的代碼中,注意str和summary函數的應用。
2.2.6列表
列表是最復雜的一種數據結構。去查了一下《R語言編程藝術》,列表需要注意的有:
1、[]單括號索引返回一個子列表;[[]]雙重是取列表中的元素,返回的是元素本身,不是列表;
2、列表的增加z$b <- “abc”這樣就可以;也可以z[2:3] <- c(TRUE,FALSE).做東西的時候發現用c也可以,不過要注意 c(list,list(newelement)).
下面有一個小trick,把忽略的代碼放到if(FALSE){…}.
2.3數據的輸入
R可以從各種不同的地方導入數據,如圖:
可以從http://cran.r-project.org/doc/manuals/R-data.pdf 下載數據輸入輸出手冊《R數據的導入和導出》。發現了一個好東西,看一看,叫做 來自google的R語言編碼風格指南。
2.3.1 用鍵盤輸入
這個方法好。首先定義一個數據框,然后調用edit函數進行編輯。
mydata <- data.frame(age = numeric(0), gender = character(0)) mydata <- edit(mydata) #這里要注意必須將edit()的結果賦值給mydata,因為edit只是對mydata的副本進行的編輯 這里的語句可以用fix(mydata)代替 numeric 函數有一個參數length,0表示沒有值。 edit函數挺好用,感覺
2.3.2從csv文件中讀入數據
read.table 函數 read.table(file, header = FALSE, sep = "", quote = "\"'", dec = ".", numerals = c("allow.loss", "warn.loss", "no.loss"), row.names, col.names, as.is = !stringsAsFactors, na.strings = "NA", colClasses = NA, nrows = -1, skip = 0, check.names = TRUE, fill = !blank.lines.skip, strip.white = FALSE, blank.lines.skip = TRUE, comment.char = "#", allowEscapes = FALSE, flush = FALSE, stringsAsFactors = default.stringsAsFactors(), fileEncoding = "", encoding = "unknown", text, skipNul = FALSE) read.csv(file, header = TRUE, sep = ",", quote = "\"", dec = ".", fill = TRUE, comment.char = "", ...) read.csv2(file, header = TRUE, sep = ";", quote = "\"", dec = ",", fill = TRUE, comment.char = "", ...) read.delim(file, header = TRUE, sep = "\t", quote = "\"", dec = ".", fill = TRUE, comment.char = "", ...) read.delim2(file, header = TRUE, sep = "\t", quote = "\"", dec = ",", fill = TRUE, comment.char = "", ...) #網上有詳細的解釋,這個函數有些復雜,實話說 函數 read.table 是讀取矩形格子狀數據最為便利的方式。因為實際可能 遇到的情況比較多,所以預設了一些函數。這些函數調用了 read.table 但改變了它的一些默認參數。 注意,read.table 不是一種有效地讀大數值矩陣的方法: 見下面的 scan 函數。 一些需要考慮到問題是: 編碼問題 如果文件中包含非-ASCII字符字段,要確保以正確的編碼方式讀取。 這是在UTF-8的本地系統里面讀取Latin-1文件的一個主要問題。 此時,可以如下處理 read.table(file("file.dat", encoding="latin1")) 注意,這在任何可以呈現Latin-1名字的本地系統里面運行。 首行問題 我們建議你明確地設定 header 參數。按照慣例,首行只有對應列的字段而 沒有行標簽對應的字段。因此,它會比余下的行少一個字段。 (如果需要在 R 里面看到這一行,設置 header = TRUE。) 如果要讀取的文件里面有行標簽的頭字段(可能是空的), 以下面的方式讀取 read.table("file.dat", header = TRUE, row.names = 1) 列名字可以通過 col.names 顯式地設定; 顯式設定的名字會替換首行里面的列名字(如果存在的話)。 分隔符問題 通常,打開文件看一下就可以確定文件所使用的字段分隔符, 但對於空白分割的文件,可以選擇默認的sep = "" ( 它能使用任何空白符作為分隔符,比如空格,制表符,換行符), sep = " " 或者 sep = "\t"。 注意,分隔符的選擇會影響輸入的被引用的字符串。 如果你有含有空字段的制表符分割的文件, 一定要使用 sep = "\t"。 引用 默認情況下,字符串可以被 " 或 ' 括起,並且兩種情況下,引號內部的字符都作為 字符串的一部分。有效的引用字符(可能沒有)的設置由 參數 quote 控制。對於sep = "\n", 默認值改為 quote = ""。 如果沒有設定分隔字符,在被引號括起的字符串里面,引號需要用 C格式的逃逸方式逃逸,即在引號前面直接加反斜杠 \。 如果設定了分隔符,在被引號括起的字符串里面,按照電子表格的習慣, 把引號重復兩次以達到逃逸的效果。例如 'One string isn''t two',"one more" 可以被下面的命令讀取 read.table("testfile", sep = ",") 這在默認分隔符的文件里面不起作用。 缺損值 默認情況下,文件是假定用 NA 表示缺損值, 但是,這可以通過參數 na.strings 改變。 參數 na.strings 是一個可以包括一個或多個 缺損值得字符描述方式的向量。 數值列的空字段也被看作是缺損值。 在數值列,值 NaN,Inf 和 -Inf 都可以被接受的。 尾部空字段省略的行 從一個電子表格中導出的文件通常會把拖尾的空字段(包括它們的分隔符) 忽略掉。為了讀取這樣的文件,必須設置 參數 fill = TRUE。 字符字段中的空白 如果設定了分隔符,字符字段起始和收尾處的空白會作為字段一部分看待的。 為了去掉這些空白,可以使用參數 strip.white = TRUE。 空白行 默認情況下,read.table 忽略空白行。 這可以通過設置 blank.lines.skip = FALSE 來改變。 但這個參數只有在和 fill = TRUE 共同使用時才有效。 這時,可能是用空白行表明規則數據中的缺損樣本。 變量的類型 除非你采取特別的行動,read.table 將會為數據框的每個變量 選擇一個合適的類型。如果字段沒有缺損以及不能直接轉換,它會按 logical, integer, numeric 和 complex 的 順序依次判斷字段類型。1如果所有這些類型都失敗了, 變量會轉變成因子。 參數 colClasses 和 as.is 提供了很大的控制權。 as.is 會 抑制字符向量轉換成因子(僅僅這個功能)。 colClasses運行為輸入中的每個列設置需要的類型。 注意,colClasses 和 as.is 對每 列專用, 而不是每個變量。因此,它對行標簽列也同樣適用(如果有的話)。 注釋 默認情況下,read.table 用 # 作為注釋標識字符。 如果碰到該字符(除了在被引用的字符串內),該行中隨后的內容將會被忽略。 只含有空白和注釋的行被當作空白行。 如果確認數據文件中沒有注釋內容,用 comment.char = "" 會比較安全 (也可能讓速度比較快)。 逃逸 許多操作系統有在文本文件中用反斜杠作為逃逸標識字符的習慣, 但是Windows系統是個例外(在路徑名中使用反斜杠)。 在 R 里面,用戶可以自行設定 這種習慣是否用於數據文件。 read.table 和 scan 都有一個邏輯參數 allowEscapes。 從 R 2.2.0 開始,該參數默認為否,而且反斜杠是唯一被解釋為 逃逸引用符的字符(在前面描述的環境中)。如果該參數設為是, 以C形式的逃逸規則解釋,也就是控制符如 \a, \b, \f, \n, \r, \t, \v,八進制和十六進制如 \040 和 \0x2A 一樣描述。任何其它逃逸字符都看着是自己,包括反斜杠。 常用函數 read.csv 和 read.delim 為 read.table 設定參數以符合英語語系本地系統中電子表格導出的CSV和制表符分割的文件。 這兩個函數對應的變種 read.csv2 和 read.delim2 是針對在逗號作為小數點的國家使用時設計的2。 如果 read.table 的可選項設置不正確, 錯誤信息通常以下面的形式顯示 Error in scan(file = file, what = what, sep = sep, : line 1 did not have 5 elements 或者 Error in read.table("files.dat", header = TRUE) : more columns than column names 這些信息可能足以找到問題所在,但是輔助函數 count.fields 可以進一步的深入研究問題所在。 讀大的數據格子(data grid)時,效率最重要。設定 comment.char = "", 以原子向量類型(邏輯型,整型,數值型,復數型,字符型或原味型)設置每列的 colClasses ,給定需要讀入的行數 nrows (適當地高估一點比不設置 這個參數好)等措施會提高效率。
網址為:http://www.biosino.org/R/R-doc/R-data_cn/Variations-on-read_002etable.html 。
用help(file)可以查看與讀取file相關的函數,包括從文件,壓縮包,網址等。
2.3.3導入excel數據
最好的方式是將excel數據另存為為上述csv文件再進行讀取。可以用RODBC包讀取excel數據(xls類型),表格的第一列應該包含列名,還可以從Access讀取文件。讀取xlsx格式的,用xlsx包用read.xlsx(file,n)函數讀取excel,file是工作薄名字,n表示第幾個工作表。xlsx包可以新建和編輯xlsx文件。
2.3.4xml文件
XML包可以讀取、寫入、操作xml文件。
2.3.5從網頁抓取
可以用readLines()先把網頁保存下來,然后用grep和gsub一類函數來處理。當然,更好的方式是用RCurl包和xml包提取想要的信息。
2.3.6導入SPSS數據
foreign包中的read.spss函數,Hmisc包中的spss.get()函數(這個好)。
2.3.7導入SAS數據
foreign包中的read.ssd函數,Hmisc包中的sas.get()函數(這個好)。
2.3.8~~~
書上以后還有從Stata,netCDF,HDF5讀取數據,從數據庫系統讀取數據,先不看,還沒涉及到過。
2.4變量標注
可以將數據集進行標注,便於理解。一種方式是變量名的命名,另一種是利用factor函數進行值標簽標注。
2.5處理數據對象的實用函數
下面寫幾個沒怎么用過的函數:
1、首先是 typeof、class、mode的區別。
我這里用個因子例子來說明,希望能講清楚 > gl(2,5) #新建一個因子 [1] 1 1 1 1 1 2 2 2 2 2 Levels: 1 2 > class(gl(2,5)) #查看變量的類,顯示為因子; [1] "factor" > mode(gl(2,5)) #查看數據大類,顯示為數值型; [1] "numeric" > typeof(gl(2,5)) #查看數據細類,顯示為整數型; [1] "integer"
轉自:http://bbs.pinggu.org/thread-2587230-1-1.html
str函數用的也比較少,可以查看變量的結構,詳細信息。
objects函數,可以查看數據框的列……
tail函數顯示對象的最后部分。
其他的函數都比較熟悉了。
附錄G中有處理GB、TB級別的數據的討論。
下一張是繪圖,很好,要好好學一下。