【怪毛匠子整理】

1、下載

wget http://mirror.bjtu.edu.cn/cran/src/base/R-3/R-3.0.1.tar.gz

2、解壓:

tar -zxvf R-3.0.1.tar.gz

cd R-3.0.1

3、安裝

yum install readline-devel

yum install libXt-devel

./configure

如果使用rJava需要加上 --enable-R-shlib

./configure  --enable-R-shlib --prefix=/usr/R-3.0.1

make

make install

4、配置環境變數

vi .bash_profile

PATH=/usr/R-3.0.1/bin

5、測試:建立指令碼(t.R)

cd /opt/script/R

vim t.R

#!/path/to/Rscript    #第一行

x<-c(1,2,3)    #R語言程式碼

y<-c(102,299,301)

model<-lm(y~x)

summary(model)

6、測試:

  • 執行指令碼

R CMD BATCH --args /opt/script/R/t.R

more /opt/script/R/t.Rout    #檢視執行的結果

或者第二種方式

  • 檢視結果

Rscript /opt/script/R/test.R    #結果直接輸出到終端

安裝和解除安裝R:

 make uninstall

注意:R的升級必須先解除安裝(make uninstall)

再重新安裝(下載/解壓/configure/make/make install)

R】Linux安裝R語言包(Installing R packages on Linux)

有關install.packages()函式的詳見:R包 package 的安裝(install.packages函式詳解)

R的包(package)通常有兩種:

1 binary package:這種包屬於即得即用型(ready-to-use),但是依賴與平臺,即Win和Linux平臺下不同。

2 Source package: 此類包可以跨平臺使用,但用之前需要處理或者編譯(compiled)。

以下一些常用的包相關的函式:

.libPaths():檢視包的安裝目錄

library():檢視已經安裝的包目錄

library(mypackage):載入mypackage包

getOption("defaultPackages"):檢視啟動R時自動載入的包。

help(package = 'mypackage'):檢視‘mypackage’的幫助

args(function):檢視函式的引數

example(function):自動執行該函式幫助文件中的例子,很贊!

demo("package"):展示一些包中demostration,需要再看下??

vignette('mypackage'):有的包,特別是bioconductor的包有vignette,用函式檢視

openVignette('mypackage'):這個函式也可以檢視vignette,更好用一些

RSiteSearch("helpinfor"):搜尋R網站上的“helpinfor”相關資訊

help.start():檢視已經安裝包的詳細HTML文件,這個命令非常爽

更新:

search():檢視當前載入的包

sessionInfo():檢視R中載入的包

methods():檢視某個S3泛型函式中所有的方法或者一個類中所有的方法(S3:S version 3)

showMethods(class = "myClass"):檢視S4類的方法

findMethods("myMethods"):檢視method的程式碼

class(myObject):檢視某個物件的類

getClass(“class/package”):檢視某個class或者包的具體內容

getSlots("class"):檢視某個class的slot

slotNames(MyObject):檢視某個物件的slot。

可以使用Myobject@slotNames訪問物件的slot值,這個@設計實在是太爽了,可以連續用。

查詢包內資訊:1. ?function/method:檢視某個“函式”或者“方法”的詳細內容

2. class?graph::graph:檢視“組”的詳細內容的一個例子。這個例子的來源是查詢graph包時候,檢視其中class的資訊,輸入??graph後出現一個graph::graph-class

ls("package:mypackage"):檢視"mypackage"中的所有物件。

安裝source package方法

1 在終端輸入 # R CMD INSTALL /.../mypackage.tar.gz

使用此方法,需要解決包依賴問題,即安裝此包所依賴的包,安裝過程有提示

2 也可以使用R的install.packages()函式安裝

回答:可以使用install.packages()函式安裝,而且比較簡便,即聯網即可裝,裝了就可用。

# R

> install.packages('mypackage')

回答2:可以使用install.packages()安裝本地下載的包,尤其適用於在伺服器上安裝包

$ R

> install.packages( c("XML_0.99-5.tar.gz", "http://www.cnblogs.com/Interfaces/Perl/RSPerl_0.8-0.tar.gz"), repos = NULL, configure.args = c(XML = '--with-xml-config=xml-config', RSPerl = "--with-modules='IO Fcntl'"))

3 Bioconductor的安裝方法

> source("http://bioconductor.org/biocLite.R")

> biocLite("mypackage")

4 解除安裝package

remove.packages("mypackage")

5 檢視R及其package的version

R version: version 或者 R.version

R package version:

6 更新包

update.packages( )  可以定期執行以下

7 使用別人安裝的包

修改.bashrc檔案,新增環境變數R的lib路徑

export R_LIBS=/home/.../R/lib64/R/library

R中用.libPaths()函式檢視lib路徑,如果有多個lib,install.packages()預設是安裝在第一個目錄下

安裝R語言的包的方法

 1. 自動安裝(線上安裝)

在R的控制檯,輸入

install.packages(“gridExtra”) # 安裝 gridExtra

install.packages(“stepNorm”, contriburl=”http://www.your.url”, dependencies = TRUE) # 安裝 stepNorm

若要指定安裝目錄 (e.g. “mydir”),則輸入

install.packages(“stepNorm”, contriburl=”http://www.biostat.ucsf.edu/jean/software”, lib=”mydir”)

這種方法可能找不到需要的package,那麼可以用 方法2

2. 手動安裝(離線安裝)

Windows:

下載package.zip檔案

開啟R的選單欄->Packages->“Install package from local zip file…”

選擇package.zip檔案

R_program_install_package

Linux上安裝R包(離線安裝):

下載package.tar.gz檔案

在Shell終端(注意不是R)輸入:

sudo R CMD INSTALL package.tar.gz

注意:需要sudo許可權才能安裝。否則提示:

username is not in the sudoers file. This incident will be reported.

檢視全部安裝的R包:

.packages(all.available=T)

檢視某個安裝的R包:

library(“XML”)

help(package=”XML”)

R語言學習筆記

第1章 R的使用

1.R語句由函式和賦值。R使用<-作為賦值符號:

x <- rnorm(5)  #建立一個名為x的向量物件,x包含5個符合標準正太分佈的隨機偏差#

rnorm(5) -> x與 x <- rnorm(5),這兩個語句等價。

2.簡單的R會話:

研究上述10名嬰兒的:(1)體重分佈;(2)體重和月齡的關係

程式碼清單:

age <- c(1, 3, 5, 2, 11, 9, 3, 9, 12, 3)           #使用函式c()以向量的形式輸入月齡資料#

weight <- c(4.4, 5.3, 7.2, 5.2, 8.5, 7.3, 6, 10.4,   #使用函式c()以向量的形式輸入體重資料#

10.2, 6.1)

mean(weight)            #使用函式mean()求體重平均值#

sd(weight)               #使用函式sd ()求體重標準差#

cor(age, weight)          #使用函式cor()求體重與月齡之間相關係數#

plot(age, weight)         #使用函式plot(),以圖形形式表現體重與月齡之間關係#

# q()                   #使用函式q ()結束程式#

輸出結果:

第2章 建立資料集

1.訪問向量中元素

通過方括號中給定元素所處的數值,可以直接訪問向量中的元素。例如,a[c(3,5)],訪問向量a中的第3個和第5個元素。

程式碼清單:

a <- c(1, 2, 5, 3, 6, -2, 4)

a[3]

a[c(1, 3, 5)]

a[2:6]   #訪問從第2個元素到第6個元素#

輸出結果:

2.建立矩陣

矩陣都是二維的,和向量類似,矩陣中也僅能包含一種資料型別。

通過函式matrix建立矩陣,一般格式如下:

myymatrix <- matrix(vector, nrow=number_of_rows,          #nrow(行)#

ncol=number_of_columns,                               #ncol(列) #

byrow=logical_value,    # byrow=true(按行填充)/ byrow=false(預設:按列填充)#

dimnames=list(char_vector_rownames,char_vector_colnames))

#dimnames包含了可選的以字元型向量表示的行名稱和列名稱#

程式碼清單①:

y <- matrix(1:20, nrow = 5, ncol = 4)   #輸出從1到20,5行4列,預設按列進行填充#

y

輸出結果:

程式碼清單②:

cells <- c(1, 26, 24, 68)         #向量賦值#

rnames <- c("R1", "R2")        #行名稱#

cnames <- c("C1", "C2")        #列名稱#

mymatrix <- matrix(cells, nrow = 2, ncol = 2, byrow = TRUE,  #2行2列,按行填充#

dimnames = list(rnames, cnames))                     #行列名稱賦值#

mymatrix

輸出結果:

如果按照列填充:

cells <- c(1, 26, 24, 68)

rnames <- c("R1", "R2")

cnames <- c("C1", "C2")

mymatrix <- matrix(cells, nrow = 2, ncol = 2, byrow = FALSE,

dimnames = list(rnames, cnames))

mymatrix

輸出結果:

我們可以使用下標和方括號來選擇矩陣的行、列或元素。X[i,]指矩陣x中的第i行,X[,j]指出第j列,x[i,j]指第i行第j個元素。選擇多行或多列時,下標i和j可為數值型向量,如下程式碼清單演示:

程式碼清單③:

x <- matrix(1:10, nrow = 2)     #沒有對行、列名稱進行命名,輸出結果自動生成#

x

輸出結果:

程式碼清單④:

x[2, ]      #輸出矩陣x中第2行#

x[,2]      #輸出矩陣x中第2列#

x[1,4] #輸出矩陣x中第1行,第4列#

x[1,c(4,5)]  #輸出矩陣x中第1行,第4、5列#

3.建立陣列

陣列(array)與矩陣類似,但是維度可以大於2。陣列可通過array函式建立,形式如下:

myarray<-array(vector,dimensions,dimnames)  #vector包含了陣列中的資料,dimensions是一個數值型向量,給出了各個維度下標的最大值,dimnames是可選的、各維度名稱標籤的列表#

程式碼清單:

dim1 <- c("A1", "A2")

dim2 <- c("B1", "B2", "B3")

dim3 <- c("C1", "C2", "C3", "C4")

z <- array(1:24, c(2, 3, 4), dimnames = list(dim1, dim2, dim3))

#將1~24按照列排方式,排列在4個2行3列,建立成三維(2×3×4)數值型陣列#

z

輸出結果:

4.建立資料框

資料框是R中最常見的資料結構,資料框中不同的列可以包含不同模式的資料。

mydata <-data.frame(col1,col2,col3,…)   #列向量col1,col2,col3,…可為任何型別,每一列的名稱可由names指定。

程式碼清單①:(建立)

patientID <- c(1, 2, 3, 4)

age <- c(25, 34, 28, 52)

diabetes <- c("Type1", "Type2", "Type1", "Type1")

status <- c("Poor", "Improved", "Excellent", "Poor")

patientdata <- data.frame(patientID, age, diabetes, status)

patientdata

輸出結果:

程式碼清單②:(選取資料框中的元素)

patientdata[1:2]

#或者patientdata[c("patientID","age")]  結果一樣#

程式碼清單③:(選取資料框中的列向量)

patientdata$age     #$表示選取特定列向量#

程式碼清單④:(table生成列聯表)

table(patientdata$diabetes,patientdata$status)

5.因子的使用

factor()以一個整數向量的形式儲存類別值,整數的取值範圍是[1…k],同時一個由字串(原始值)組成的內部向量將對映到這些整數上。

如:向量:diabetes<-c(“Type1”, “Type2”, “Type1”, “Type1”)

diabetes<-factor(diabetes)將此向量儲存為(1,2,1,1),並在內部將其關聯為1=Type1和2=Type2(具體賦值根據字母順序而定)

要表示有序型變數,需要為函式factor()指定引數ordered=TRUE。給定向量:

status<-c(“Poor”,“Improved”,“Excellent”,“Poor”)

語句status<-factor(status,ordered=TRUE)會將向量編碼為(3,2,1,3),並在內部將這些值關聯為1=Excellent、2=Improved以及3=Poor。另外,針對此向量進行的任何分析都會將其作為有序型變數對待,並自動選擇合適的統計方法。

levels()可以覆蓋預設排序。例如

status<-factor(status,order=TRUE,levels=c(“Poor”,“Improved”,”Excellent”))

各水平的賦值將為1=Poor、2=Improved、3=Excellent

程式碼清單:(因子的使用)

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, order = TRUE)

patientdata <- data.frame(patientID, age, diabetes, status)

str(patientdata)

執行結果:

summary(patientdata)

6.列表

列表(list)是R的資料型別中最為複雜的一種。一般來說,列表就是一些物件(或成分,component)的有序集合。列表的好處:1.列表允許以一種簡單的方式組織和重新呼叫不相干的資訊。2.許多R函式的執行結果都是以列表的形式返回的。列表允許你整合若干(可能無關的)物件到單個物件名下。例如,某個列表中可能是若干向量、矩陣、資料庫,甚至其他列表的組合。可以使用函式list()建立列表:

mylist<-list(object1,object2,…)

其中的物件可以是目前為止講到的任何結構。也可以將列表中物件命名為:

mylist<-list(object1,object2,…)

程式碼清單:(列表)

g <- "My First List"

h <- c(25, 26, 18, 39)

j <- matrix(1:10, nrow = 5)

k <- c("one", "two", "three")

mylist <- list(title = g, ages = h, j, k)      #建立列表#

mylist                              #輸出整個列表#

執行結果:

$title

[1] "My First List"                #字串#

$ages

[1] 25 26 18 39                   #數值型向量#

[[3]]

[,1] [,2]                    #矩陣#

[1,]    1    6

[2,]    2    7

[3,]    3    8

[4,]    4    9

[5,]    5   10

[[4]]                            #字元型向量#

[1] "one"   "two"   "three"

訪問:可以通過在雙重方括號中指明代表某個成分的數字或名稱來訪問列表中的元素。如輸入mylist[[2]]或mylist[[“ages”]]均指向量“[1] 25 26 18 39”。

R語言的資料匯入與匯出學習筆記

卡卡 2013-04-29 10:45:20

福爾·摩斯曾說過:“資料,資料,沒有資料的推理是罪惡!”不過比起有意思的統計分析,資料的匯入與匯出顯得十分的無趣,但是不得不說統計分析的資料匯入與匯出是個讓人沮喪的任務,而且耗時巨大。

今天分享的是R中資料的輸出與一些特定格式的資料讀入。

一、資料的輸出

R中提供了write.table(),cat()等函式來匯出資料。不過值得指出的是R語言能夠匯出的資料格式是有限的,比如在基本包中,我們能夠匯出資料的格式只有txt,csv。

現在介紹一下兩個函式的用法:

write.table(x, file = “”, append =FALSE, quote = TRUE, sep = ” “,

eol = “\n”, na = “NA”, dec = “.”,row.names = TRUE,

col.names = TRUE, qmethod = c(“escape”, “double”),

fileEncoding = “”)

write.csv(…)

write.csv2(…)

write.csv(),write.csv2()可以看做write.table()的變體,我們知道write.csv(),與引數sep=“,”的write.table()是等效的。下面介紹幾個常見引數:

x:資料集

file:檔案的路徑,包括檔名如:”D:/R/data/data1.csv”

quote:資料在寫入檔案中時我們常用引號將其隔開,當引數為F時,檔案中的資料不再用引號修飾

append:是否追加,如果檔名已存在而沒有選擇追加,那麼檔案將會被覆蓋。(覆蓋時是沒有提示的,所以命名需要注意一些。

cat(… , file = “”, sep = ” “, fill = FALSE, labels = NULL,

append = FALSE)

cat()作為一個輸出函式與dos命令差不多,也是將資料集或資料寫入檔案中,常用引數和write.table()類似。

cat()函式用來輸出,可以把多個引數連線起來再輸出(具有paste()的功能)。

例如:

> cat(c(“AB”, “C”),c(“E”, “F”), “n”, sep=”/ “)

AB/ C/ E/ F/ n

還可以指定一個引數file=給一個檔名,可以把結果寫到指定的檔案中,如: > cat(“i = “, 1, “n”, file=”d:/R/data2.txt”)如果指定的檔案已經存在則原來內容被覆蓋。加上一個append=TRUE引數可以不覆蓋原檔案而是在檔案末尾附加,這很適用於執行中的結果記錄。

當然cat()的用法比較豐富,也可以用來檢視檔案,與format合用控制輸出格式等。

二、資料的匯入

先介紹R中基本的讀取資料函式read.table()的用法:

read.table(file, header = FALSE, sep = “”, quote = “\”‘”,

dec = “.”, 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)

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=”", …)

介紹常用引數:

File:檔案路徑,可以用絕對路徑也可以用相對路徑,R的工作目錄你可以使用getwd()來檢視,用setwd()來改。

Header:讀取檔案的第一行是否用作變數名

Sep:分隔符,引數為“,“時等價於read.csv()

Scan()函式也是一個讀取資料比較好的函式,但是引數較為複雜,我們可以說,read.table()函式是scan函式的設定好部分引數的結果。

Read.delim()這個可以讀到剪貼簿的東西,用法為read.delim(clipboard)其他引數與read.table相同。

Read.fwf()讀取固定長度的資料,也可以利用這個特性截去資料的尾巴或者表格的尾巴。

自帶的foreign包可以實現s-plus,sas,spss,stata的資料讀入。以讀stata資料為例:

>Read.dta(“d:/R/data3.dta”)其他引數與read.table也是一樣的。

遺憾的是,基本包與foreign包都沒有辦法讀取excel的資料。但這並不代表我們沒辦法讀取excel的資料。例如我們可以將excel的資料放在剪貼簿中,通過read.delim(clipbroad)來讀取。也可以將excel表格變成csv格式的再處理。最後指出,R中的gdata包的read.xls函式以及RODBC包中也有相應的處理函式。

本文的最後,運用R語言的幫助文件《R資料的匯入與匯出》中的一段話作為結束:“In general, statistical systems like R arenot particularly well suited to manipulations of large-scale data. Some othersystems are better than R at this, and part of the thrust of this manual is tosuggest that rather than duplicating functionality in R we can make anothersystem do the work! (For example Therneau & Grambsch (2000) commented thatthey preferred to do data manipulation in SAS and then use packagesurvival in S for the analysis.)”

From:http://blog.csdn.net/yujun7654321/article/details/8117421

原文連結:http://tezhengku.com/topic/?p=563

R語言-資料匯入

  • |
  • 瀏覽:241
  • |
  • 更新:2015-09-29 16:51
  • |
  • 標籤:軟體

R語言,最適合統計研究背景的人員學習,具有豐富的統計分析功能庫以及視覺化繪圖函式可以直接呼叫。通過Hadoop-R更可支援處理百億級別的資料。

工具/原料

  • 電腦
  • R軟體

方法/步驟

  1. 1

1、匯入 CSV檔案

1)使用 read.csv函式匯入CSV檔案

2)read.csv函式語法: read.csv (file)

3)案例: data1 <- read.csv ("D:/data/datatable.csv")    --絕對路徑

  1. 2

2、匯入文字檔案

1)使用 read.table函式匯入CSV檔案

2)read.table函式語法: read.table (file, header = FALSE, sep="", …)

file:檔案路徑

header:檔案標題行(檔案頭),預設為 FALSE,表示沒有標題行

sep:分隔符,預設為空,表示預設把資料匯入成一列

3)案例

data2 <- read.table ("D:/data/datatable.csv", header = TRUE, sep ="," )

data3 <- read.csv ("D:/data/datatable.csv", header = TRUE, sep ="," )

  1. 3

3、匯入 Excel檔案

1) Excel檔案匯入步驟(x86作業系統)

引入 RODBC包

install.packages ("RODBC")

library (RODBC)

注:安裝包時,包名需要加引號,而引入包時不加引號!

使用 odbcConnectExcel函式來連線 Excel 2003(字尾名為 .xls)

odbcConnectExcel函式語法: odbcConnectExcel (file)

案例: connect1 <- odbcConnectExcel ("D:/data/datatable.xls")

使用 odbcConnectExcel2007函式來連線 Excel 2007(字尾名為 .xlsx)

odbcConnectExcel函式語法: odbcConnectExcel2007 (file)

案例: connect2 <- odbcConnectExcel ("D:/data/datatable.xlsx")

使用 sqlFetch函式來讀取 Excel中的 Sheet資料

sqlFetch函式語法: sqlFetch (connectname, Sheetname)

案例:data4 <- sqlFetch (connect1, "datasheet")

使用 odbcClose函式關閉 R和 Excel的連線

odbcClose函式語法: odbcClose (connectname)

案例: odbcClose (connect1)

  1. 4

2)Excel檔案匯入步驟(x64作業系統)

引入 XLConnect包(需安裝JDK程式)

使用 loadworkbook函式來載入 Excel檔案

loadworkbook函式語法: loadworkbook (file)

案例: connect3 <- loadworkbook ("D:/data/datatable.xls")

使用 readworksheet函式來讀取 Excel檔案資料

readworksheet函式語法: readworksheet (connectname, Sheetname)

案例: data5 <- readworksheet (connect1, "datasheet")

R 資料的匯入和匯出

Next: Notes

R 資料的匯入和匯出

這是從R中匯入或匯出資料的一個指導手冊。

本文件的當前版本為0.01 β。該文件譯自 R-2.6.1 文件(2007年11月26日)。

丁國徽([email protected]) 譯。

本文件的一些釋出資訊放置在 http://www.biosino.org/R/R-doc/

ISBN 3-900051-10-0

Next: Introduction, Previous: Top, Up: Top

說明

Next: Words from the Translator, Up: Notes

版權宣告

英文文件版權宣告:

Copyright © 2000–2006 R Development Core Team

Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.

Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.

Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be stated in a translation approved by the R Development Core Team.

參考譯文如下(具體以英文原文為準):

版權 © 2000–2007 R Development Core Team

在遵守幷包含本文件版權宣告的前提下,製作和釋出本文件的完整拷貝是允許的。 並且,所有這些拷貝均受到本許可宣告的保護。

在遵守上述完整拷貝版本有關版權宣告的前提下,拷貝和釋出基於本文件完整 拷貝的修改版本是允許的,並且,釋出所有通過修改本文件而得到的工作成果, 須使用與本文件的許可宣告一致的許可宣告。

在遵守上述修改版本版權宣告的前提下,拷貝和釋出本文件其它語言的翻譯版本 是允許的,如果本許可宣告有經 R 核心開發小組(R Development Core Team)核 準的當地化譯本,則遵循當地化譯本。

關於本中文翻譯文件的版權宣告:

本文件為自由文件(GNU FDL), 在GNU自由文件許可證(http://www.gnu.org/copyleft/fdl.html)下發布, 不明示或者暗示有任何保證。本文件可以自由複製,修改,散佈,但請保留使用 許可宣告。

Next: Acknowledgements, Previous: Copyright, Up: Notes

譯者前言

不能期望一個軟體可以做所有的事情1。R 也不例外。因此, R 需要和其它東西協作。包括我們人類,需要我們輸入資料,匯出資料。包括我們的 其它軟體,Excel,SPSS,等等,資料格式都是特異的,需要R 特別處理。 包括我們的資料庫系統,R 不是用來管理資料的,所以需要專業的資料庫幫忙。 也包括不同機器間,上面編譯的 R 也是需要交換資料。這一冊文件就是描述這些事情的。

R 的主要目的就是分析資料。雖然,你可以用它來處理文件,畫個奧運會的鳥巢,R 的主要目的還是資料分析。這是專業化個性化的時代,特色取勝。

這個文件在幾年前就寫了一些。很實用的一個文件。開發人員可以大致瞭解 R 和其它軟體大致的通訊情況,非開發人員至少可以瞭解, R 通過包能直接讀取Excel表格。

已經是凌晨了,不多寫了。

任何問題和建議可以給Email!

感謝身邊的朋友!

丁國徽

Email:[email protected]

2008年1月6日

Previous: Words from the Translator, Up: Notes

致謝

手冊中關係資料庫的內容部分基於Douglas Bates 和 Saikat DebRoy早期寫的 一個手冊。本手冊主要由 Brian Ripley 編寫。

這裡用到很多擴充套件包都是由自願者貢獻。這裡提到的包以及主要作者如下,

CORBA

Duncan Temple Lang

foreign

Thomas Lumley, Saikat DebRoy, Douglas Bates, Duncan Murdoch and Roger Bivand

hdf5

Marcus Daniels

ncdf

David Pierce

ncvar

Juerg Schmidli

rJava

Simon Urbanek

RMySQL

David James and Saikat DebRoy

RNetCDF

Pavel Michna

RODBC

Michael Lapsley and Brian Ripley

RSPerl

Duncan Temple Lang

RSPython

Duncan Temple Lang

SJava

John Chambers and Duncan Temple Lang

XML

Duncan Temple Lang

Brian Ripley 是實現R的連線(connection)支援的作者。

Next: Spreadsheet-like data, Previous: Notes, Up: Top

1 緒論

儘管大多數讀者覺得統計分析非常有趣,但為統計分析讀入資料以及 把結果匯出到其它系統以方便報表編寫可能是一件比統計分析更花時間 和難辦的差事。

本手冊描述了 R 自身以及從 CRAN 獲得的一些包裡面的 資料匯入和匯出功能。這裡描述的一些包可能還正在開發,但它們已經 提供了一些非常有用的功能了。

除非特別說明,本手冊中描述的所有功能可以在各種平臺執行的R 中使用。

通常,如R一類的統計系統特別不適合處理大尺度的資料。 其它一些系統在這方面可以比R作的好。本手冊的部分要點是 建議使用者可以用其它系統做資料處理工作而不是用 R 裡面重複的功能( 例如,Therneau 和 Grambsch (2000) 就提到他們喜歡在SAS裡面進行資料 處理,然後才用 S 的包 survival 進行資料分析)。 現在,還有幾個包允許用其它程式語言(如Java, perl 和 python)開發的函式直接整合進R程式碼裡面。這樣 就可以更加方便地用這些語言的功能。 (見Omegahat專案(http://www.omegahat.org) 的SJavaRSPerl 和 RSPython包,和來自 CRAN的rJava包)

值得注意到是 R 和 S 一樣都來自Unix的小的可重用工具的傳統, 因此,在資料匯入前和結果匯出後用awk 和 perl 等 工具處理資料都是值得推崇的。 Becker, Chambers & Wilks (1988, 第 9 章)中的案例分析就是這樣的 一個例子。其中,在 S 資料輸入前用Unix工具檢驗和處理資料。 R 自己也是採用這種策略,比如用 perl 而不是R 處理自身的幫助檔案資料庫,函式 read.fwf開始就是呼叫一個 perl程式碼直到後來明確在執行時不能依賴 perl。 現在,傳統的Unix工具被很廣泛的使用,包括在Windows系統上。

Next: Export to text files, Previous: Introduction, Up: Introduction

1.1 Imports 匯入

匯入 R 的資料中最容易的格式是簡單的文字檔案。對於小型或中型的問題, 這種格式都可以接受的。 從文字檔案匯入資料的原始函式(primary function)是 scan。 電子表格類似資料(Spreadsheet-like data)一章中討論的大多數比較便利 的函式都是基於這個原始函式。

但是,所有的統計顧問們對客戶用軟盤或光碟提交一些私有的二進位制資料 (比如,`Excel 電子表格'或`SPSS檔案')都比較熟悉。 通常,可以做的最簡單的事情是用原始軟體把資料用文字檔案匯出(而統計 顧問們為了這個目的會在他們電腦裡面安裝大多數常用的軟體)。不過, 這不會總是可能的2。 在從其它統計軟體中匯入資料(Importing from other statistical systems)一章中,我們會討論一些可以在 R 裡面 直接讀取這些檔案的工具。 對 Excel 電子表格,讀取Excel電子表格(Reading Excel spreadsheets) 一章對可以獲得的相關方法進行了總結。

在很少的一些例子中,出於簡潔和快速訪問考慮,資料以二進位制格式儲存。 這種情況下一個例子是我們已經見過幾次的影象資料。它通常以二進位制流的 方式儲存然後在記憶體裡面呈現,而且可能在資料前面加個資訊頭。 這種資料格式在二進位制檔案(Binary files)和二進位制連線 (Binary connections)部分都有所討論。

對於大的資料庫資料,通常要藉助資料庫管理系統(Database management system,DBMS)來處理。我們可以通過DBMS從資料庫裡面提取沒有格式的 文字檔案,但是對於大多數這一型別的DBMS,我們可以直接通過 R 的包來實現資料提取操作:見關係資料庫(Relational databases)部分。 通過網路連線來匯入資料在網路介面(Network interfaces)一章討論。

Next: XML, Previous: Imports, Up: Introduction

1.2 匯出到文字檔案中

從 R 裡面匯出結果通常是一個很少爭論的事情,但是實際操作中仍然 有一些問題。在知道目標應用軟體前提下,通常把文字檔案作為最為便利的 中間轉換工具。(如果需要二進位制檔案,見二進位制檔案(Binary files) 一章)。

函式 cat 是匯出資料的函式的基礎。它有一個file引數 和append。通過連續地呼叫 cat 對一個文字檔案寫入。 最好的方式是,特別需要多次這樣做的時候,首先為寫入或新增文字 開啟一個 file 連線,然後用cat連線,最後關掉 (close)它。

最常見的工作是把一個矩陣或資料框以數字的矩形網格方式寫入檔案中, 而且還可能保留行列的標籤。 這可以通過函式write.table 和 write來完成。 函式write僅可以寫出一個矩陣或向量的特定列(和對一個矩陣進行轉置)。 函式 write.table 更為便利,它可把一個數據框( 或一個可以強制轉換為資料框的物件)以包含行列標籤的方式寫出。

在把一個數據框寫入到一個文字檔案中時,有許多問題需要考慮。

  1. 精度問題

大多數通過這些函式對實/複數的轉換是全精度的,但是用write時, 精度由options(digits)的當前設定確定。 如果需要更多的控制,在一個數據框上逐列使用 format 。

  1. 首行問題

R 傾向在首行不出現表示行名字的條目,因此 在檔案裡面

dist climb time Greenmantle 2.5 650 16.083 ...

其它一些系統需要給行名字一個條目(可能為空),此時, 可以通過在write.table 中 設定引數col.names = NA 來實現。

  1. 分隔符問題 檔案中常用的欄位分隔符是逗號,因為在英語語系的國家, 逗號幾乎不可能出現在任何欄位中。這種檔案被稱為 CSV(逗號分隔值)檔案,對應的包裝函式(wrapper function) write.csv提供了適當的預設值。 在一些本地系統中,逗號作為十進位制位中的小數點 (在write.csv函式中設定引數dec = ",") 3 ,此時CSV檔案以分號作為欄位分隔符: write.csv2 設定了適當的預設值。

用分號或製表符(sep = "\t")可能是一種 比較安全的選擇。

  1. 缺損值問題 預設情況下,缺損值以 NA 形式輸出,但這可以通過引數 na來改變。 注意,NaN 在write.table裡面 以 NA 看待,但在cat或 write裡面是區別對待的。
  2. 被引號括起的字串 預設情況下,字串被引號括起(包括行列的名字)。 引數 quote 控制著字元和因子變數的引號引用問題。

需要注意字串中的引號巢狀問題。三種 有用的形式如下

> df <- data.frame(a = I("a \" quote")) > write.table(df) "a" "1" "a \" quote" > write.table(df, qmethod = "double") "a" "1" "a "" quote" > write.table(df, quote = FALSE, sep = ",") a 1,a " quote

逃逸(Escape)的第二種形式常用於電子表格中。

包 MASS 中的函式 write.matrix 為寫矩陣 提供了一種專用的介面。它同時提供了以區塊方式寫的可選項,這樣 可以降低記憶體的使用。

用 sink 可能把標準 R 輸出重定向到一個檔案中,因此 捕獲了 print 語句(可能是暗含的)的輸出。通常, 這不是最有效的辦法,options(width)設定可能需要增加。

包 foreign裡面的函式 write.foreign 用 write.table 產生文字檔案,同時編寫一個 可以讓另外一個統計包讀入該文字檔案的程式碼檔案。現在支援 匯出到 SPSS 和 Stata。

Previous: Export to text files, Up: Introduction

1.3 XML 檔案

當從一個文字檔案中讀取資料時,使用者有責任知道並且按習慣建立檔案,比如, 在匯出問文字檔案(Export to text files)一節中提到的 註釋字元,是否有資訊頭行,分隔符,缺損值的描述方式(等等)。 標籤語言既可以描述內容又可以定義內容的結構,這樣可以使一個檔案 的內容自我明瞭。此時,不需要為讀取這些資料的軟體專門提供這些 細節資訊。

可擴充套件標籤語言(eXtensible Markup Language)– 通常簡化為 XML – 可用於提供這樣的結構,不僅能描述標準資料集也可以描述更復雜的資料結構。 XML 現在變得非常流行,並且作為常規資料標籤和交換的標準。 它被各種團體所採用,從地理資料(如地圖),影象展示4 到數學等。

包 XML 為在 R 和 S-PLUS 讀寫XML文件提供了 通用的工具。它讓我們可以很容易的使用這種近年出現的技術。 多位研究人員正在探索如何在其它事情中用 XML 描述在不同應用軟體中共享的資料集;儲存不同系統共享的 R 和 S-PLUS 物件;通過 SVG (可擴充套件向量圖, Scalable Vector Graphics,XML 的一種針對向量圖應用的變種) 描述影象;描述函式文件;生成“生動的”含有文字, 資料和程式碼的分析/報告。

對 XML 包裡面工具的描述已經超出本文件內容範圍: 詳細資訊和例子見該包的主頁(http://www.omegahat.org/RSXML)。 CRAN裡面的包StatDataML 是基於XML包的一個例子。

Next: Importing from other statistical systems, Previous: Introduction, Up: Top

2 電子表格類似的資料

在匯出為文字檔案(Export to text files)一節,我們可以看到 電子表格類似的文字檔案有一系列的變化樣式。在這些樣式中,資料以矩形 格子狀呈現,而且還可能包括行列標籤。在本節,我們考慮 把這種檔案匯入 R。

Next: Fixed-width-format files, Previous: Spreadsheet-like data, Up: Spreadsheet-like data

2.1 read.table 的變化樣式

函式 read.table 是讀取矩形格子狀資料最為便利的方式。因為實際可能 遇到的情況比較多,所以預設了一些函式。這些函式呼叫了read.table 但改變了它的一些預設引數。

注意,read.table 不是一種有效地讀大數值矩陣的方法: 見下面的 scan 函式。

一些需要考慮到問題是:

  1. 編碼問題

如果檔案中包含非-ASCII字元欄位,要確保以正確的編碼方式讀取。 這是在UTF-8的本地系統裡面讀取Latin-1檔案的一個主要問題。 此時,可以如下處理

read.table(file("file.dat", encoding="latin1"))

注意,這在任何可以呈現Latin-1名字的本地系統裡面執行。

  1. 首行問題

我們建議你明確地設定 header 引數。按照慣例,首行只有對應列的欄位而 沒有行標籤對應的欄位。因此,它會比餘下的行少一個欄位。 (如果需要在 R 裡面看到這一行,設定 header = TRUE。) 如果要讀取的檔案裡面有行標籤的頭欄位(可能是空的), 以下面的方式讀取

read.table("file.dat", header = TRUE, row.names = 1)

列名字可以通過 col.names 顯式地設定; 顯式設定的名字會替換首行裡面的列名字(如果存在的話)。

  1. 分隔符問題

通常,開啟檔案看一下就可以確定檔案所使用的欄位分隔符, 但對於空白分割的檔案,可以選擇預設的sep = "" ( 它能使用任何空白符作為分隔符,比如空格,製表符,換行符), sep = " " 或者 sep = "\t"。 注意,分隔符的選擇會影響輸入的被引用的字串。

如果你有含有空欄位的製表符分割的檔案, 一定要使用 sep = "\t"。

  1. 引用 預設情況下,字串可以被 " 或 ' 括起,並且兩種情況下,引號內部的字元都作為 字串的一部分。有效的引用字元(可能沒有)的設定由 引數 quote 控制。對於sep = "\n", 預設值改為 quote = ""

http://www.dxy.cn/bbs/topic/32661575

R資源分享 視訊

R語言筆記部落格

http://blog.csdn.net/saghir?viewmode=contents

http://blog.csdn.net/saghir/article/details/46504655

http://www.dxy.cn/bbs/topic/10612374?from=recommend

從園子裡搜一搜,以“R語言”為關鍵詞,發現相關內容並不多!

不過,我把好的網頁挑出來,供自己研究(2007年12月6日11:12分為止)

一、R語言相關資料

1、R語言

R語言 - 丁香園論壇

2、R語言課件(復旦大學)

http://www.dxy.cn/bbs/actions/archive/post/6908564_1.html

3、上傳:GLM課件(R語言)

上傳:GLM課件(R語言) - 丁香園論壇

4、利用R語言實現微陣列資料分析-聚類分析

http://www.dxy.cn/bbs/actions/archive/post/6387021_1.html

5、Medline 文獻挖掘的開放資源庫----MedlineR

http://www.dxy.cn/bbs/actions/archive/post/2059801_1.html

二、R語言相關問題

1、R 語言,請幫忙

http://www.dxy.cn/bbs/post/view?bid=73&id=7689210&sty=3&keywords=R%D3%EF%D1%D4

2、請教:有用過R語言和fbioconductor的嗎

http://www.dxy.cn/bbs/actions/archive/post/7169770_1.html

3、求助:perl程式(加一點統計知識)

http://www.dxy.cn/bbs/actions/archive/post/4592794_0.html

4、請教諸位高手關於單倍型分析的一些問題

http://www.dxy.cn/bbs/actions/archive/post/2698109_1.html

5、perl 求助一程式。

http://www.dxy.cn/bbs/actions/archive/post/4644532_1.html

6、[求助]關於SAM 誰能幫我講解一下SAM方法?我不是很懂

http://www.dxy.cn/bbs/post/view?bid=73&id=5137629&sty=3&keywords=R%D3%EF%D1%D4

網站:www.r-project.org

R is a free software environment for statistical computing and graphics . Download and install the package.

  • 入門資料:

simple_R_Tutorial http://www.biostat.pitt.edu/biost2055/11/110107_simple_R_tutorial.doc

《153分鐘學會R》 http://cos.name/cn/topic/7673

  • 官方資料:

《R Language Definition》、《An Introduction to R》(也有中文版,建議看英文)

  • 參考資料:

《R語言參考卡片》http://wenku.baidu.com/view/6f214c330b4c2e3f57276341.html

  • 有用的論壇:

統計之都

牛人的部落格:http://yixf.name/

謝益輝的中文主頁:裡面有高質量的R語言、統計學資料

  • 軟體和網站:

RStudio:http://www.rstudio.com/

R語言互動式學習網站:http://tryr.codeschool.com/

AM方法?我不是很懂

http://www.dxy.cn/bbs/post/view?bid=73&id=5137629&sty=3&keywords=R%D3%EF%D1%D4

R語言書籍的學習路線圖 - Alexander

R語言書籍的學習路線圖 - Alexander

部落格園-所有隨筆區03-04 20:47

現在對R感興趣的人越來越多,很多人都想快速的掌握R語言,然而,由於目前大部分高校都沒有開設R語言課程,這就導致很多人不知道如何著手學習R語言。

對於初學R語言的人,最常見的方式是:遇到不會的地方,就跑到論壇上吼一嗓子,然後欣然or悲傷的離去,一直到遇到下一個問題再回來。當然,這不是最好的學習方式,最好的方式是——看書。目前,市面上介紹R語言的書籍很多,中文英文都有。那麼,眾多書籍中,一個生手應該從哪一本著手呢?入門之後如何才能把自己練就成某個方面的高手呢?相信這是很多人心中的疑問。有這種疑問的人有福了,因為筆者將根據自己的經歷總結一下R語言書籍的學習路線圖以使Ruser少走些彎路。

本文分為6個部分,分別介紹 初級入門, 高階入門 , 繪圖與視覺化 , 計量經濟學 , 時間序列分析 , 金融 等。

1.初級入門

《An Introduction to R》 ,這是官方的入門小冊子。其有中文版,由丁國徽翻譯,譯名為 《R導論》 。《R4Beginners》 ,這本小冊子有中文版應該叫 《R入門》 。除此之外,還可以去讀 劉思喆 的 《153分鐘學會R》 。這本書收集了R初學者提問頻率最高的153個問題。為什麼叫153分鐘呢?因為最初作者寫了153個問題,閱讀一個問題花費1分鐘時間,全域性下來也就是153分鐘了。有了這些基礎之後,要去讀一些經典書籍比較全面的入門書籍,比如《統計建模與R軟體》,國外還有《R Cookbook》和《R in action》,本人沒有看過,因此不便評論。

最後推薦,《R in a Nutshell》。對,“果殼裡面的R”!當然,是開玩笑的,in a Nutshell是俚語,意思大致是“簡單的說”。目前,我們正在翻譯這本書的中文版,大概明年三月份交稿!這本書很不錯,大家可以從現在開始期待,並廣而告知一下!

2.高階入門

讀了上述書籍之後,你就可以去高階入門階段了。這時候要讀的書有兩本很經典的。《Statistics with R》和《The R book》。之所以說這兩本書高階,是因為這兩本書已經不再限於R基礎了,而是結合了資料分析的各種常見方法來寫就的,比較系統的介紹了R線上性迴歸、方差分析、多元統計、R繪圖、時間序列分析、資料探勘等各方面的內容,看完之後你會發現,哇,原來R能做的事情這麼多,而且做起來是那麼簡潔。讀到這裡已經差不多了,剩下的估計就是你要專門攻讀的某個方面內容了。下面大致說一說。

3.繪圖與視覺化

亞里斯多德說,“較其他感覺而言,人類更喜歡觀看”。因此,繪圖和視覺化得到很多人的關注和重視。那麼,如何學習R畫圖和資料視覺化呢?再簡單些,如何畫直方圖?如何往直方圖上新增密度曲線呢?我想讀完下面這幾本書你就大致會明白了。

首先,畫圖入門可以讀《R Graphics》,個人認為這本是比較經典的,全面介紹了R中繪圖系統。該書對應的有一個網站,google之就可以了。更深入的可以讀《Lattice:Multivariate Data Visualization with R》。上面這些都是比較普通的。當然,有比較文藝和優雅的——ggplot2系統,看《ggplot2:Elegant Graphics for Data Analysis》。還有資料探勘方面的書:《Data Mining with Rattle and R》,主要是用Rattle軟體,個人比較喜歡Rattle!當然,Rattle不是最好的,Rweka也很棒!再有就是互動圖形的書了,著名的互動系統是ggobi,這個我已經喜歡兩年多了,關於ggobi的書有《Interactive and Dynamic Graphics for Data Analysis With R and GGobi》,不過,也只是適宜入門,更多更全面的還是去ggobi的主頁吧,上面有各種資料以及包的更新資訊!

特別推薦一下,中文版繪圖書籍有謝益輝的《現代統計圖形》。

4.計量經濟學

關於計量經濟學,首先推薦一本很薄的小冊子:《Econometrics In R》,做入門用。然後,是《Applied Econometrics with R》,該書對應的R包是AER,可以安裝之後配合使用,效果甚佳。計量經濟學中很大一部分是關於時間序列分析的,這一塊內容在下面的地方說。

5.時間序列分析

時間序列書籍的書籍分兩類,一種是比較普適的書籍,典型的代表是:《Time Series Analysis and Its Applications :with R examples》。該書介紹了各種時間序列分析的經典方法及實現各種經典方法的R程式碼,該書有中文版。如果不想買的話,建議去作者主頁直接下載,英文版其實讀起來很簡單。時間序列分析中有一大塊兒是關於金融時間序列分析的。這方面比較流行的書有兩本《Analysis of financial time series》,這本書的最初是用的S-plus程式碼,不過新版已經以R程式碼為主了。這本書適合有時間序列分析基礎和金融基礎的人來看,因為書中關於時間序列分析的理論以及各種金融知識講解的不是特別清楚,將極值理論計算VaR的部分就比較難看懂。另外一個比較有意思的是Rmetrics推出的《TimeSeriesFAQ》,這本書是金融時間序列入門的東西,講的很基礎,但是很難懂。對應的中文版有《金融時間序列分析常見問題集》,當然,目前還沒有發出來。經濟領域的時間序列有一種特殊的情況叫協整,很多人很關注這方面的理論,關心這個的可以看《Analysis of Integrated and Cointegrated Time Series with R》。最後,比較高階的一本書是關於小波分析的,看《Wavelet Methods in Statistics with R》。附加一點,關於時間序列聚類的書籍目前比較少見,是一個處女地,有志之士可以開墾之!

6.金融

金融的領域很廣泛,如果是大金融的話,保險也要被納入此間。用R做金融更多地需要掌握的是金融知識,只會資料分析技術意義寥寥。我覺得這些書對於懂金融、不同資料分析技術的人比較有用,只懂資料分析技術而不動金融知識的人看起來肯定如霧裡看花,甚至有人會覺得金融分析比較低階。這方面比較經典的書籍有:《Advanced Topics in Analysis of Economic and Financial Data Using R》以及《Modelling Financial Time Series With S-plus》。金融產品定價之類的常常要用到隨機微分方程,有一本叫《Simulation Inference Stochastic Differential Equations:with R examples》的書是關於這方面的內容的,有例項,內容還算詳實!此外,是風險度量與管理類。比較經典的有《Simulation Techniques in Financial Risk Management》、《Modern Actuarial Risk Theory Using R》和《Quantitative Risk Management:Concepts, Techniques and Tools》。投資組合分析類和期權定價類可以分別看《Portfolio Optimization with R》和《Option Pricing and Estimation of Financial Models with R》。

7.資料探勘

這方面的書不多,只有《Data Mining with R:learing with case studies》。不過,R中資料探勘方面的包已經足夠多了,參考包中的幫助文件就足夠了。

8.附註

出於版權等事宜的考慮,我無法告知你說在“新浪愛問”等地方可以直接免費下載到上面提到的這些書,但是,我想你可以發揮自己的聰明才智去體悟!

http://yihui.name/cn/2012/09/equal-and-arrow/

http://www.zhihu.com/question/19611094

R是一門古怪的語言,這一點沒什麼好否認的。它的古怪有好有壞,在不同人眼中也可能是好事或壞事。R是受S語言影響發展起來的,S語言誕生於貝爾實驗室。後來AT&T被分拆的時候,這個實驗室被拆為今天的貝爾實驗室(已經沒什麼名氣了)和AT&T實驗室。如 前文 所說,這個夏天在AT&T實驗室呆著,S語言的一位作者Rick是我的辦公室鄰居,另一位作者Allan暑假裡退休了,第三位作者是John Chambers,他早已離開實驗室去高校了。S誕生在(文字)資料堆裡,而R誕生之後很快走向了合作開發,這一系列歷史給它帶來了一些看似古怪的特徵。

賦值

賦值符號在絕大多數語言中都沒什麼好討論的,因為就是一個等號而已。在R社群,這一點卻被討論來討論去,主要原因是箭頭賦值符號 <- 的存在。箭頭 來源於貝爾實驗室早年的某臺古董機器上有一個下劃線的鍵,但打出來顯示的是箭頭。S祖先們認為箭頭是一個很形象的賦值符號,於是下劃線被採納下來,甚至後來衍生出右箭頭( -> )這樣更奇怪的賦值符號(表示把左邊的值賦給右邊的變數),還有雙箭頭( <<- )表示給上一層環境中的變數賦值。

最初S程式碼中,下劃線本身就是賦值符號,例如 x_1 表示把1賦值給x。我大三的時候還用S-Plus寫了不少下劃線賦值的S程式碼。後來R core們做了一個艱難的決定,允許等號作為賦值符號,廢棄了下劃線的賦值功能,但下劃線的傳統仍然無處不在,例如Emacs / ESS中預設情況下敲下劃線會被替代為左箭頭(為了得到真的下劃線需要連續按兩次下劃線),儘管下劃線本身已經不能直接顯示為箭頭,ESS仍然想昨日重現,通過軟體方式強行替代之。

我不止一次地說過,我是堅定的等號黨。因為等號有賦值功能,大多數語言都用等號(沒見其它語言的程式設計師抱怨等號不形象),等號對我來說不存在歧義,讓我的程式碼更安全。反對黨(也就是箭頭黨)的理由通常是等號存在二義性:它既可以賦值,也可以傳遞函式引數,如:

x = 1:10 length(x = 1:10)

可是幾乎所有語言都這樣,也沒有見那些語言的程式設計師對此有抱怨。規則很簡單:如果等號出現在單獨的環境中,它就是賦值;如果寫在函式引數位置,它就是傳引數。但R的古怪讓這個簡單規則也可以變得很難判斷,例如:

length((x = 1:10)) length({x = 1:10})

因為 () 和 {} 將表示式與外面的環境隔離開來,它們被解析的時候先單獨執行,所以實際上x在自己的環境裡被賦值了;然後 () 和 {} 會返回整個表示式的結果,這個結果再傳給 length() 函式。

箭頭在任何地方的意思都是賦值(在當前環境下),它可以被寫在任何地方,包括函式引數的位置,如:

length(x <- 1:10)

這句程式碼先對x賦值,然後把整個表示式的值傳遞給 length() 。我們可以把它寫得更暈:

length(x = y <- 1:10)

此時等號表示傳引數,而y無論如何都會被賦值。在函式引數位置上賦值通常有一舉兩得的效果,也就是把兩件事情寫在一行上,之所以能一舉兩得,主要是利用了箭頭的副作用;如果是初學者,這種寫法最好避免,首先追求程式碼的清晰性,避免產生副作用的程式碼。因為箭頭無論何地都可以賦值,要是用錯了也不會報錯,這種錯誤往往難以意識到。例如我們建立一個向量,元素為1和2,元素名字分別為a和b,如果不小心寫成這樣:

c(a = 1, b <- 2) # 本來應該是c(a = 1, b = 2)

你可能不會意識到第二個元素是沒有名字的,並且這句話帶來一個副作用,就是悄悄給b賦了值。

如果你像我一樣有時候寫程式碼不愛打空格,那麼還有一個更可怕的潛在錯誤,要是不小心犯了的話可能很久都查不出來。我們寫幾個邏輯表示式:x大於5,x小於3,x小於-3。你可能想,這個太簡單了,操起鍵盤就寫:

x>5 x<3 x<-3

因為你的懶惰,小於號和負號悄磨嘰走到了一起,不小心形成了具有強大法力的賦值箭頭,你並沒有完成x與-3的邏輯大小比較,而是給x賦值為3。當這幾行程式碼在這裡擺著的時候你可能覺得很容易看出來,可是當你玩了兩個小時資料之後,想隨手看一下df資料框中x變數小於-1的值有多少個,你可能會寫出sum(df$x<-1) 這樣的語句,相應的結果是,你沒得到 df$x 小於-1的總數,而是把df資料裡x這一列給修改為1了。如果df是一個很大的資料,或你辛辛苦苦處理了半天才得來的資料,你就哭吧。我對這個詭異的案例印象深刻,是因為我親眼看見過兩例別人的錯誤,在那之後我明知有這樣的危險,但自己還是傻不愣登毀了一次自己的資料。

對右箭頭賦值,我的想象是這樣:某天某祖先寫了一長段程式碼,但沒有事先寫上把這段程式碼的結果賦值保留下來,悔得腸子都青了,只好敲回車任憑程式在那兒跑,跑完了得不到返回值,於是該祖先發明瞭一個右箭頭,這樣即使先寫了一段程式碼也不用怕,因為可以最後加上 -> x 就把前面的返回值賦給x了。我不習慣閱讀這種事後賦值的程式碼,就像讀偵探小說似的,到最後才發現程式碼建立了一個變數。

這種“後悔”的想象還可以繼續:R中有一個特殊的變數叫 .Last.value ,它總是儲存最近一次執行的最後一個結果,即使你上一條程式碼沒有賦值儲存,你仍然可以通過 .Last.value 去獲取。這也意味著,無論你跑什麼程式,R都會隨時盯著你的返回結果,把它賦值給.Last.value 。

命名風格

R core的主要命名風格是以點分隔詞,例如 t.test ,這與早年時下劃線有賦值含義有關,另外我猜想也是懶惰,因為點只需要按鍵一次,而其它命名法都需要按Shift鍵,如camelCase。不過這個也不絕對,R裡面仍然有些下劃線命名的函式如seq_along ,或駝峰命名如summaryRprof 。這裡面有多人合作時的個人風格,更重要的可能是S3泛型函式的影響。S3函式的特點就是“主函式.類名”,如 summary.lm ,它根據傳遞進來的物件的類來匹配具體的子函式。因為在泛型函式中,點是有特殊意義的,所以我們要小心點(這裡注意斷句),為了安全起見,最好乾脆避免點,免得跟泛型函式扯上關係,尤其是包的作者在寫函式時。

在其它很多語言如JavaScript中,點通常表示取一個物件的子元素或者應用方法,如 x.toString() 。R的點不存在這個問題(要達到同樣的效果,一般用 $),它除了可能有S3的意思,沒有其它特殊含義。考慮到其它語言以及S3兩個原因,我最終投奔了下劃線命名法(foo_bar ),次要原因是我覺得下劃線把兩個單詞分得更開,比 fooBar 易讀。

考慮R中有成千上萬的函式命名,某些物件命名可以理解,但仍然透露出某種不規範的痕跡。比如 seq() 是S3泛型函式,而同時又存在 seq.int 和seq_along 這兩種風格的函式,並且前者並不是 seq() 應用在 int 類上的函式!

每一門語言都有一些歷史糟粕,R作為一群統計學家維護的語言,從規範來說槽點很多,但事情的另一面是,他可以讓什麼最小驚訝原則見鬼去,老夫今天就是要寫一個函式把混合效應模型中的隨機效應算完打印出來。他的隨意對應用統計者來說,可能恰好也是好事。沒有這看似亂糟糟的各種貢獻,R的發展也許會慢很多。無論如何,對如今已經趨於成熟的R,我們作為使用者還是應該儘量朝規範的方向走。

語法

以for迴圈為例,很多語言都是教條式的 for (i=0; i<10; i++) 迴圈,而R是 for (i in x) ,這個x可以是很多種物件,例如 1:10 ,或 10:1 ,或c('a', 'c', 'b') ,或 list(a = 1, b = 'fgh') ,等等。這種讓迴圈變數在一組物件中迴圈的做法,我猜想可能借鑑自bash指令碼的語法,如

for i in `ls *.csv` do echo $i done

它為啥要參照bash指令碼的迴圈語法而不是C語言的語法,可能跟貝爾實驗室的資料處理傳統有關。至今AT&T實驗室仍然跑著大量的bash指令碼,處理大量的文字資料(迴圈逐個處理每個檔案),這一點我在那裡感觸太深了。同樣誕生於貝爾實驗室的Awk,其迴圈語法也借鑑了bash的語法(C語法也保留著),可以在一個數組中迴圈。

自動擴充套件和匹配

別的語言一般都不能計算貓加狗這樣的表示式,但R可以算 1:10 + 1:2 ,兩個長度不一樣的物件也可以做計算,原因是R總是把短物件自動擴充套件到長物件的長度再計算;這種擴充套件有時候很難想象,如matrix(1:10, 5) + 1:2 (一個矩陣加一個向量)。向量一般來說看作列向量,也就是n x 1的矩陣,但你可以看見以下表達式都可以正常計算:

matrix(1:10, 5) %*% 1:2 # 5x2乘以2x1,沒問題 1:2 %*% matrix(1:10, 1) # 2x1乘以1x10,沒問題 1:2 %*% matrix(1:10, 2) # 你到底是2x1還是1x2?

這實在讓人防不勝防。除非你事先小心實驗,否則這種矩陣乘法出錯了都不知道。但這問題其實也來源於作者的懶惰,只要把向量轉化為嚴格的矩陣(不要讓R去自動猜測調整),一切問題都解決了。

這些“自動”特徵給資料分析其實帶來了不少好處,例如在迴歸設計陣中加一列給截距項的1,你不必寫一串1,只要 X = cbind(X, 1) 就可以了,R會自動把1擴充套件為X的行數;又如你想讓散點圖中的點按照資料順序依次用紅色、藍色、紅色、藍色……那麼 plot(x, y, col = c('red', 'blue')) 就夠了,而不必把顏色向量寫完整了。對資料分析者來說,那些計算機的嚴格規則最好是匿得越遠越好。

有時候自動擴充套件悄無聲息帶來的問題會很難查詢,例如在各種巧合之下,kuanguang壇霸 問的這個問題 下面掩蓋了一個極大的陰謀,初學者可能看不出裡面的門道,樓主的程式碼執行表面上看起來成功了,但實際上完全是錯誤的程式碼。本來這是個很好的例子,只是這傢伙碎碎念實在太多了,一天到晚問題不斷,我也來一次小心眼,裝沒看見好了。

引號

R的懶惰是別的語言打死都想不通的,比如把一個不存在的物件轉化為字元,這麼說有點抽象,我們可以考慮一下library() 這個函式。

library(fun)

這樣一句話是什麼意思呢? fun 不是一個R物件,它根本不存在,但為什麼library(fun) 就可以載入一個名叫fun 的包?主要原因就是懶,因為懶得打引號:

library("fun")

正常來說,這個函式的第一個引數應該是R包的名字,也就是說應該是字串。在函式內部,最終需要的也是一個字串。R之所以能把這件事情搞得這麼奇葩,也是與它強大的“基於語言的計算”(Computing on the Language)能力有關,參見手冊“R Language Definition”第6節。所謂基於語言的計算,就是把程式碼拿來作計算,各種魔法parse() 、 deparse() 、substitute() 、 eval() 、match.call() 等等,極大增強了R的語言功能,所以說它是一門統計計算語言實在太低估了它。

例如這裡是一個簡單的函式,把輸入的合法的R符號轉化為字串:

f = function(x) deparse(substitute(x)) f(asdf) f(hahaha)

這種懶惰在一些Linux工具中也可以看見身影,例如 tar ,我們可以按標準寫上減號 - 以傳引數,也可以省略減號讓tar 把第一個引數當作引數,後面的引數當檔名:

tar -x -z -f R-2.15.1.tar.gz tar -xzf R-2.15.1.tar.gz tar xzf R-2.15.1.tar.gz

這就是“多打一個字元會死星人”。

岔開話題回到 library() 這個函式,我印象中R core一直後悔這個函式的命名,想把它改成 use() 。因為library() 的存在且高頻使用,讓很多使用者稱R包為library(例如I'm using the rpart library),這曾經讓某R core(M.M.)極度不爽,因為library在R中的概念是“庫”,而不是單個的包,一個庫可能是多個包的集合,單個包叫package。啥時侯你意識到函式命名可能比寫函式本身還難時,就表明你的碼農功力又上一層樓了。

LaTeX

那個年代科學計算類都和LaTeX能扯上關係,這年頭都奔HTML去了,誰還去列印大部頭的手冊啊。R的文件就是一種偽LaTeX文件,R自身也拼命模仿一些LaTeX程式,例如 texi2dvi() 函式。這種偽TeX文件帶來的就是新的解析工作,參見 parse_Rd() 魔法,於是各種規矩鋪天蓋地而來……

值傳遞與引用傳遞

R一向沒有引用傳遞,但這說法不太嚴格,我們可以把一個環境當作引數傳遞來去,環境裡的物件可以在任何地方被改變。

z = new.env() z$x = 1 f = function(env) { env$x = 2 } f(z) z$x # 變成了2

近兩年Chambers大人繼歷史上推出S3、S4之後,又推出了引用類(reference classes),應該算是補缺吧。值傳遞雖然有點低效,但更安全一些,不會冷不丁不小心就修改了一個變數。

這麼寫下去沒完沒了,不寫了,還是寫書更重要,就是這樣(波波頭的微博禪)。

R,不僅僅是一種語言

本文原載於《程式設計師》雜誌2010年第8期,因篇幅所限,有所刪減,這裡刊登的是全文。

簡介:R是什麼

轉帖:來自《程式設計師》上的一篇文章,希望對大家有幫助

工欲善其事,必先利其器,作為一個戰鬥在IT界第一線的工程師,C/C++、java、perl、python、ruby、php、javascript、erlang等等等等,你手中總有一把使用自如的刀,幫助你披荊斬棘。

應用場景決定知識的儲備與工具的選擇,反過來,無論你選擇了什麼樣的工具,你一定會努力地把它改造成符合自己應用場景所需的那個樣子。從這個道理來說,我選擇了R[1]作為資料探勘人員手中攻城陷池的那把雲梯,並努力地把它改造成自己希望的那個樣子。

關於R的一個比較準確的描述是:R是一門用於統計計算和作圖的語言,它不單是一門語言,更是一個數據計算與分析的環境。統計計算領域有三大工具:SAS、SPSS、S,R正是受S語言和Scheme語言影響發展而來。其最主要的特點是免費、開源、各種各樣的模組十分齊全,在R的綜合檔案網路CRAN中,提供了大量的第三方功能包,其內容涵蓋了從統計計算到機器學習,從金融分析到生物資訊,從社會網路分析到自然語言處理,從各種資料庫各種語言介面到高效能運算模型,可以說無所不包,無所不容,這也是為什麼R正在獲得越來越多各行各業的從業人員喜愛的一個重要原因。

從R的普及來看,國外的普及度要明顯好於國內,跟盜版windows的泛濫會影響linux在中國的普及一樣的道理,破解的matlab與SPSS的存在也影響了R在中國的使用人群。但在國外高校的統計系,R幾乎是一門必修的語言,具有統治性的地位。在工業界,作為網際網路公司翹楚的google內部也有不少的工程使用R進行資料分析工作,這裡[2]有一個google campus的講課視訊,內容就是用R作為工具來講述資料探勘的概念與演算法。

隨著近年來R使用者的增加,關於R的報道也屢有見於報端,如2009年初美國紐約時報就有一篇很好的報道:Data Analysts Captivated by R’s Power[3]。報道中述說了R的發展歷史以及由於資料探勘需求的增長而日益普及的現狀,它雖源於S但其發展卻遠遠地超過了S,已經成為高校畢業學生所選用的第二大工具語言,google與Pfizer的員工也介紹了R在自己公司中的應用。此外,報道中google首席經濟學家Hal Varian說:R的最讓人驚豔之處在於你可以通過修改它來做所有的事情,而你已經擁有大量可用的工具包,這無疑讓你是站在巨人的肩膀上工作。

以下就R的幾個主要應用場景以及我在實踐中的經驗對這個並不算主流的程式語言作一些介紹。

統計計算:R之最強項

R從它出生的第一天就是為了做統計計算的,那時它被定義為一個統計計算與作圖的工具,雖然發展到現在它已經被賦予了越來越強大的功能,但現在R的開發人員裡,還是以各個高校統計系的老師與學生為主,他們自然最瞭解自己最需要的是什麼。

在統計計算中,我們常常需要根據樣本資料作線性迴歸,得到一定的規律性,R中實現這個功能十分簡單,以下是一個一元線性迴歸的例子:

x <- 1:10

y <- x+rnorm(10, 0, 1)

fit <- lm(y ~ x)

summary(fit)

註明一下,R裡的“<-”符號意義為賦值,大多數情況下它可以用“=”號來代替,但某些特殊的場合不可以,本文會遵循“<-”這種官方使用的寫法。這個例子的前兩行準備了兩列資料:自變數x與因變數y,第三行的函式lm即根據提供的樣本資料進行線性迴歸計算,得到的模型結果可以用第四行打印出來。函式lm除了可以做這種簡單的一元線性迴歸,還可以做多元線性迴歸,同時返回模型的各種統計量。

做統計的往往免不了要做各種各樣的圖形,R的另一個基本特點就是對圖形的強大支援,以下程式碼展示了一個箱線圖的作法,程式碼來自boxplot函式的manual,該圖顯示了幾列資料的分位數、中值、均值、奇異點等資訊及其對比位置。更詳細的關於R的作圖功能可以參看[4]。

boxplot(mpg~cyl,data=mtcars, main=”Car Milage Data”, xlab=”Number of Cylinders”, ylab=”Miles Per Gallon”)

機器學習:讓你的資料發揮它應有的作用

機器學習、資料探勘領域面臨著一些抽象自大量現實生活的問題,比如關聯規則挖掘、聚類、分類這三大問題。作為一個完備的工程計算包,R毫無疑問對它們都提供了足夠的支援。

關聯規則問題源於“買了這件商品的顧客還買了什麼”這個問題,現在已經廣泛應用於客戶行為分析以及網際網路使用者行為分析中。關聯規則挖掘領域最經典的演算法為apriori,R的第三方包arules[5],就是專門用於做關聯規則挖掘的。以下例子需要你已經安裝了arules包。

library(arules)

data <- paste(“item1,item2″,”item1″,”item2,item3″, sep=”\n”)

write(data, file = “demo_basket”)

tr <- read.transactions(“demo_basket”, format = “basket”, sep=”,”)

data(“Adult”)

rules <- apriori(Adult, parameter = list(supp = 0.5, conf = 0.9, target = “rules”))

最後一行的apriori函式接受一個transaction物件的輸入,輸出關聯規則物件rules,為方便起見,這裡用於計算的transaction物件Adult是通過第5行從arules包中現成載入進來的,第2~4行說明了怎麼從一個文字檔案中讀入資料並生成一個transaction物件。

聚類演算法使用最廣泛的高效演算法無疑是kmeans,R在其預設載入的stats包中就包含了這個函式,以下是一個來自kmean說明文件的例子:

x <- rbind(matrix(rnorm(100, sd = 0.3), ncol = 2), matrix(rnorm(100, mean = 1, sd = 0.3), ncol = 2))

cl <- kmeans(x, 2)

plot(x, col = cl$cluster)

points(cl$centers, col = 1:2, pch = 8, cex=2)

程式碼第1行生成兩組兩維的正態分佈的資料,第一組均值為0,第二組均值為1,兩組資料方差都為0.3。第2行對該資料進行聚類,第3和第4行把聚類結果畫出來。

分類器是模式識別領域的研究主題,也是人類認知活動的中心。多年來的學術研究積累下來很多種型別的分類器,而其中比較靠譜的分類器基本都能在R中找到對應的實現。諸多分類器中以svm最為著名,它也被一些人稱為是單分類器的王道。以下是一個利用svm對著名的iris資料集進行分類的過程,執行該例子需要你已經安裝了e1071這個包[6]。

library(e1071)

data(iris)

x <- subset(iris, select = -Species)

y <- iris$Species

model <- svm(x, y)

summary(model)

pred <- predict(model, x)

table(pred, y)

第5行程式碼呼叫svm函式,計算由x作為特徵y作為類別標籤的分類器模型,第7行把模型應用於原資料進行預測。

以上例子的演示並非想讓各位讀者當場學會各個不同領域中這些功能函式的用法,而是一方面展示一些實際的R程式碼以及它解決問題的方式,另一方面說明了R在這些常見的機器學習領域的積累。在R幫助下去解決這些或許不是我們專業的問題,可以省去我們大量重複造輪子的精力,寫出來的程式碼也足夠的短小精悍,節省時間之餘也讓你對自己演算法邏輯的全域性一覽無餘。

高效能運算:向量化與並行/分佈計算

作為現代資料探勘人員從業者,可能第一個需要關心的是所使用工具的可伸縮性(scalability),具體來說就是在面對大資料量場景時的計算能力。

一個擁有高效能運算能力的計算包,首先它必須能充分利用歷史上積累下來的那些著名的數值計算包,比如blas、lapack;另一方面,它必須具有良好的可擴充套件性,即它必須方便開發人員並行化自己的演算法,很幸運這些特性R都具備了。

類似於R、scilab與matlab那樣的工程計算包,通常都會以向量化計算(Vectorization)作為其基本的計算特點(即使python的numpy包也是如此),因為向量化的處理方式是現代大型計算機的基本特性,在計算機領域,無論硬體還是軟體,都提供了對向量化的支援,硬體上如Intel的MMX, SSE等指令集都提供了對向量化的支援,更多可以看到wikipedia上的介紹[7]。軟體上如blas等著名的計算包,天然地就可以對向量化的命令自動實施平行計算。

所謂向量化,是一種特殊的平行計算的方式,相比於一般程式在同一時間只執行一個操作的方式,它可以在同一時間執行多次操作,通常是對不同的資料執行同樣的一個或一批指令,或者說把指令應用於一個數組/向量。以下列出R中經常使用幾種向量化運算,都是十分稀鬆平常的操作,但它們本質上都是同時對一批資料應用相同的操作,所以都可以經過向量化處理方式的改造:

向量取值,如:V[1:10]向量賦值,如:V[1:10] <- seq(1,10)lapply,類似於python裡的map函式:lapply(A, mean)矩陣運算:A + B;A %*% B

向量化因其在計算過程中資料的前後不依賴的特點,是平行計算的天然先驅,一個用向量化實現的演算法,必定是一個可以高度並行化的演算法。正因為這個原因,在利用R寫指令碼的時候,都要儘量利用向量化的思想來設計自己的演算法,儘可能少地使用迴圈結構。一旦你的程式都是或大都是基於向量化的,除了當時獲得來自於計算機軟硬體上的優化外,將來某一天資料量膨脹使得計算成為瓶頸時,你就可以極為方便地把原來的演算法並行化。

正如我們所知,CRAN包括了各種你能想像得到的工具包,當然也有不少平行計算的包,這些包被歸納在R高效能運算相關的包列表中[8]。

關於R的向量化及平行計算更詳細的內容可以參考我的一篇部落格[9]。

編寫介面與工具包:最有用的包必定是你寫的那一個

一個開源軟體的最強大之處在於大量從業人員的貢獻,R最讓人激奮,進而選擇它作為工作平臺的一個重要原因則是龐大而無所不包的的CRAN,在那裡幾乎能找到所有你能想像得到的與分析研究相關的工具包,可以說絲毫不遜色於perl的CPAN。之所以擁有一個如此強大的第三方支援,一方面在於R本身在統計計算與計算能力方面的支援,另一方面則在於開發一個R擴充套件是如此地容易,以致於每一個使用R作為自己常用工具的人,都會按捺不住強烈的衝動要寫一個自己的包,以滿足工作需要。如果自己的這個包感覺寫得不錯,又為很多人所需要,就可以提交到CRAN。這是造成CRAN如此龐大的原因,但同時也造成了CRAN的軟體包良萎不全。但大多數情況下,這些包都會是你的得力助手,特別是那些著名而廣為使用的包,如果覺得它們不滿足你的需要,那麼放心地對它們進行修改吧,因為它們都是開源的。

下面展示一個簡單的R擴充套件包的製作過程:

1、生成包結構:新建一個目錄mypkg,同時作為包名,在mypkg中新建幾個目錄與檔案,mypkg的目錄結構如下圖所示。R自帶的函式package.skeleton可以自動幫你生成這些目錄,但它需要一些現成的函式物件或檔案作啟動,為了順序說明整個過程,這裡沒有使用。

2、目錄說明:必需的是DESCRIPTION檔案、man目錄和R目錄,剩下的都是可選的。DESCRIPTION檔案描述包的meta資訊;R目錄下面存放R指令碼檔案,裡面的函式可匯出作為包函式庫提供給外部使用;如果要在包裡放一些試驗資料,可以放在data目錄裡,常用是以csv格式存放,在R終端裡data(***)可以載入,這裡留空;man目錄是R的幫助文件,有一定的格式要求,這裡也留空,生成包時會有一些警告,可以不用管;src存放c/c++/fortran原始碼,必須同時放置Makefile或Makevars檔案指導編譯程式工作,這裡留空;zzz.R可以在載入包時做一些事情,這裡也留空。

3、新增功能:DESCRIPTION檔案的內容可以參考任意一個R包對應檔案的寫法,依樣把資訊修改成自己相應的資訊即可。以下只寫一個簡單的R函式作為說明,在R目錄下新增一個名為helloword.R的檔案,檔案內容如下:

helloword <- function(x, y)

{

return(x*y)

}

4、安裝:在命令列中執行R CMD build mypkg,會編譯生成一個mypkg_0.1.tar.gz安裝包,其中的數字是我在DESCRIPTION裡寫的版本號;執行R CMD INSTALL mypkg,就可以把包安裝到系統裡。

5、試驗:執行R,進入R終端;library(mypkg),載入剛製作的包;search(),可以看到mypkg包已經被載入;在R終端執行helloworld(2,3),返回6,試驗成功。

一個具有一定功能的包就這樣做好了,是不是很簡單。如果有其它需要,只要往R目錄或src目錄新增檔案,然後重新生成並安裝就可以了。R與c/c++之間的介面呼叫也十分方便,限於篇幅,無法更仔細地說明,更詳細的內容可以參考我的幾篇部落格[10-13]。

R在中國的發展

R在中國的普及現在並不十分地廣泛,主要還是學校及研究機構在使用,但近年來隨著R的聲名鵲起,也已經有越來越多各個領域的工業界從業人員選擇R作為自己的工作平臺,其中統計之都[14]是一個國內R使用者的聚焦地。今年的6月份在人民大學舉行了第3屆R語言會議,從前三屆會議的人員組成來看,R的中國使用者群一直呈現較大的增長趨勢,使用者分佈的領域也越來越豐富。第三屆R語言會議參會者人來源可以從會議紀要中看到[15]。相信隨著資料探勘廣為各個公司接受,R也會走近工業界的各行各業中。

R在豆瓣中的應用

有一段時間,我一直在尋找介乎於matlab與系統語言(如C, Fortran)的中間物,希望它既能擁有系統語言的高效能,又能方便資料探勘人員的日常工作,於是我找到了R,這不僅是一門語言,它更是一個理想的計算環境。它一方面方便我對新演算法原型的構建、除錯、評測,另一方面並沒有讓我失去系統級語言的計算優勢,甚至在實現平行計算方面擁有了更多的選擇。現在我使用R編寫我們自己的工具包,進行演算法原型構造、矩陣運算、並行演算法等離線應用,為相似性計算、推薦系統等上層應用提供底層的支援。

一個R寫的協同過濾推薦的例子

最後用一個R實現的協同過濾推薦的例子來結束本文,協同過濾是推薦系統中一個基本的演算法,詳細內容可以參考這裡[16]。由於大量地採用了向量化的計算方式(包括各種矩陣運算),所以演算法的實現相當簡潔,有可能是史上程式碼最少的協同過濾推薦引擎 data <- read.table(‘data.dat’, sep=’,', header=TRUE)

user <- unique(data$user_id)

subject <- unique(data$subject)

uidx <- match(data$user, user)

iidx <- match(data$subject, subject)

M <- matrix(0, length(user), length(subject))

i <- cbind(uidx, iidx)

M[i] <- 1

mod <- colSums(M^2)^0.5

MM <- M %*% diag(1/mod)

S <- crossprod(MM)

R <- M %*% S

R <- apply(R, 1, FUN=sort, decreasing=TRUE, index.return=TRUE)

k <- 5

res <- lapply(R, FUN=function(r)return(subject[r$ix[1:k]]))

write.table(paste(user, res, sep=’:'), file=’result.dat’,

quote=FALSE, row.name=FALSE, col.name=FALSE)

程式碼我就不細加註釋了,有興趣瞭解其原理的同學可以看這裡[16]。

參考:

[1] R官方網站

[2] Youtube上的GoogleTechTalks,通過R來教學資料探勘:Statistical Aspects of Data Mining (Stats 202)

[3] 紐約時報的報道Data Analysts Captivated by R’s Power

[4] R Graphics

[5] arules package

[6] e1072 package

[7] 向量化

[8] R高效能運算相關的包

[9] 向量化與平行計算

[10] R package的最簡單製作

[11] R與C的介面:從R呼叫C的共享庫

[12] R物件結構,用.Call的呼叫方式更靈活地寫R-package

[13] 編寫R包C擴充套件的核心指引

[14] 統計之都

[15] 第三屆R語言會議(北京會場)會議紀要

ERROR: Error sourcing C:\Users\ADMINI~1\AppData\Local\Temp\RtmpCEUCIr\file2d

原因:原始檔未使用UTF-8編碼

解決:tools-global options-general-text encoding- UTF-8

【陣列】

一維到二維

a=1:12

(一維)

dim(a)=c(3,4)

(3行4列的二維陣列)

【處理超大檔案 R語言】

用R語言作分析時,有時候需要逐行處理非常大檔案,各種教材中推薦的read.table 和scan都是一次性讀入記憶體,如果檔案有好幾個Gb大小,一般電腦肯定吃不消。其實R中可以逐行讀取的行數,這裡示例一個函式,作為備忘:

con <- file("e:/data.txt", "r")

line=readLines(con,n=1)

while( length(line) != 0 ) {

print(line)

line=readLines(con,n=1)

}

close(con)

如果需要將一行的文字劈成多段,再進行處理,可以用strsplit函式,除此之外,還有一些常用的字串處理函式,記錄如下:

substr(),nchar(), grep(), regexpr(), sub(), gsub()