R语言基础编程技巧汇编 - 20

来源:互联网 发布:淘宝入驻条件及费用 编辑:程序博客网 时间:2024/06/01 07:48

1.      RCurl设置代理

假设代理地址是10.10.10.10;端口是:8080.

设置代理地址如下:

curl<-getCurlHandle(proxy="10.10.10.10:8080");

getURL("http://baidu.com",curl=curl)

2.      抓取网页中的表格

library(XML)

library(RCurl)

u ="http://en.wikipedia.org/wiki/List_of_countries_by_population"

tables = readHTMLTable(u)

tables

 

3.       用.Machine查看本机数值类型的属性

> .Machine

$double.eps

[1] 2.220446e-16

 

$double.neg.eps

[1] 1.110223e-16

 

$double.xmin

[1] 2.225074e-308

 

$double.xmax

[1] 1.797693e+308

 

$double.base

[1] 2

 

$double.digits

[1] 53

 

$double.rounding

[1] 5

 

$double.guard

[1] 0

 

$double.ulp.digits

[1] -52

 

$double.neg.ulp.digits

[1] -53

 

$double.exponent

[1] 11

 

$double.min.exp

[1] -1022

 

$double.max.exp

[1] 1024

 

$integer.max

[1] 2147483647

 

$sizeof.long

[1] 4

 

$sizeof.longlong

[1] 8

 

$sizeof.longdouble

[1] 16

 

$sizeof.pointer

[1] 8

4.      利用RODBC访问数据库

需要安装 MySQL ODBC 5.1DriverRODBC包,本人操作系统是win7

1、进入控制面板——系统和安全——管理工具——数据源(ODBC

2、点击添加按钮,选择MySQL的驱动程序ODBC 5.1 Driver,创建新的数据源;

3、配置数据源信息,Data Source Name名字任取,TCP/IP ServerPort为数据库所在的IP地址和端口,

User为用户名,Password为密码,Database为需选择的数据库名,可以点Test按钮测试连接是否成功,

“Details”可以选择连接数据库的编码,点“OK”键结束配置;

4R语言中连接数据库:

library(RODBC);

channel = odbcConnect(‘test’, uid=’****’,pwd=’****’,

DBMSencoding=’utf8′);

test:为配置信息中的数据源名称;

uid:为数据源中设置的用户名;

pwd:为数据源中设置的密码;

DBMSencoding:与数据源设置的编码保持一致;

5、在R中使用SQL语言查询:

sqlQuery(channel,’select * from mytable’);

 

5.      绘制经济景气指数灯示例

testData=matrix(sample(1:4,size=10*12,replace=TRUE),c(10,12))#随机测试数据

row.names(testData)=paste("指数",1:10)

colnames(testData)=paste(1:12,"")

col_map=rainbow(4)#色表

plot.new()

par(mar=c(5,0,4,2))

plot.window(xlim=c(-3,13),ylim=c(0,11))

for(i in 1:10){

   for(j in 1:12){

       rect( j-.3,i-.3,j+.3,i+.3, col= col_map[testData[i,j]])

    }

}

axis(1,1:12,colnames(testData))

text(-2.5,1:10,row.names(testData))

legend('top', paste('景气水平',1:4),fill=col_map,horiz=TRUE)


6.      求投影矩阵

已知矩阵A,A(A^TA)^{-1}A^T

matrix(rnorm(2000*1000),2000,1000)->A

system.time(tcrossprod(qr.Q(qr(A))))

 用户 系统 流逝

14.23 0.31 14.65

system.time(tcrossprod(svd(A)$u))

 用户 系统 流逝

29.63 0.17 30.01

7.      提取有理数分子和分母部分

library(MASS);

frac = function(x)

{

    f= attr(fractions(x), "fracs");

   numer = as.integer(gsub("/.*", "", f));

   denom = as.integer(gsub(".*/", "", f));

   denom[!grepl("/", f)] = 1;

   return(data.frame(numerator = numer, denominator = denom));

}

x = seq(0, 1, by = 0.12);

frac(x);

 numerator denominator

1        0           1

2        3          25

3        6          25

4        9          25

5       12          25

6        3           5

7       18          25

8       21          25

9       24          25

8.       schoolmath包计算常用初等数学运算

cancel.fraction

约分

decimal2fraction

小数转化为分数

gcd

最大公约数

is.decimal

是否有小数部分

is.even

是否偶数

is.negative

是否负数

is.odd

是否奇数

is.positive

是否正数

is.prim

是否质数

is.real.positive

是否正实数

is.whole

是否整数

prime.factor

质因数分解

primes

生成质数序列

primlist

1 9999999之间的质数列表

scm

最小公倍数

9.      圆形聚类树型图

library(ape)

# add colors randomly

plot(as.phylo(hc), type = "fan",tip.color = hsv(runif(15, 0.65, 0.95), 1, 1, 0.7), edge.color = hsv(runif(10,0.65, 0.75), 1, 1, 0.7), edge.width = runif(20, 0.5, 3), use.edge.length =TRUE, col = "gray80")

 

 

library(ape)

 

# vector of colors

mypal = c("#556270","#4ECDC4", "#1B676B", "#FF6B6B","#C44D58")

# cutting dendrogram in 5 clusters

clus5 = cutree(hc, 5)

# plot

op = par(bg = "#E8DDCB")

# Size reflects miles per gallon

plot(as.phylo(hc), type = "fan",tip.color = mypal[clus5], label.offset = 1, cex = log(mtcars$mpg, 10), col = "red")


10. 利用apply、tapply、lapply、sapply、mapply、table等函数进行分组统计

apply函数(对一个数组按行或者按列进行计算):

使用格式为:

apply(X, MARGIN, FUN, ...)

其中X为一个数组;MARGIN为一个向量(表示要将函数FUN应用到X的行还是列),若为1表示取行,为2表示取列,为c(1,2)表示行、列都计算。

示例代码:

> ma <- matrix(c(1:4, 1, 6:8), nrow =2)

> ma

     [,1] [,2] [,3][,4]

[1,]    1   3    1    7

[2,]    2   4    6    8

> apply(ma, c(1,2), sum)

     [,1] [,2] [,3][,4]

[1,]    1   3    1    7

[2,]    2   4    6    8

> apply(ma, 1, sum)

[1] 12 20

> apply(ma, 2, sum)

[1]  3  7  7 15

函数tapply(进行分组统计):

使用格式为:

tapply(X, INDEX, FUN = NULL, ..., simplify= TRUE)

其中X通常是一向量;INDEX是一个list对象,且该list中的每一个元素都是与X有同样长度的因子;FUN是需要计算的函数;simplify是逻辑变量,若取值为TRUE(默认值),且函数FUN的计算结果总是为一个标量值,那么函数tapply返回一个数组;若取值为FALSE,则函数tapply的返回值为一个list对象。需要注意的是,当第二个参数INDEX不是因子时,函数 tapply() 同样有效,因为必要时 R会用 as.factor()把参数强制转换成因子。

示例代码:

> fac <- factor(rep(1:3, length =17), levels = 1:5)

> fac

 [1] 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2

Levels: 1 2 3 4 5

> tapply(1:17, fac, sum)

 1  2  3  4  5

51 57 45 NA NA

> tapply(1:17, fac, sum, simplify =FALSE)

$`1`

[1] 51

 

$`2`

[1] 57

 

$`3`

[1] 45

 

$`4`

NULL

 

$`5`

NULL

> tapply(1:17, fac, range)

$`1`

[1]  1 16

 

$`2`

[1]  2 17

 

$`3`

[1]  3 15

 

$`4`

NULL

 

$`5`

NULL

#利用tapply实现类似于excel里的数据透视表的功能:

> da

   year province sale

1 2007        A    1

2 2007        B    2

3 2007        C    3

4 2007        D    4

5 2008        A    5

6 2008        C    6

7 2008        D    7

8 2009        B    8

9 2009        C    9

102009        D   10

> attach(da)

> tapply(sale,list(year,province))

 [1]  1  4  7 10 2  8 11  6  9 12

> tapply(sale,list(year,province),mean)

      A  BC  D

2007  1  2 3  4

2008  5 NA 6  7

2009 NA  8 9 10

函数table(求因子出现的频数):

使用格式为:

table(..., exclude = if (useNA =="no") c(NA, NaN), useNA = c("no",

    "ifany","always"), dnn = list.names(...), deparse.level = 1)

其中参数exclude表示哪些因子不计算。

示例代码:

> d <- factor(rep(c("A","B","C"),10),levels=c("A","B","C","D","E"))

> d

 [1] A B C A B C A B C A B C A B C A BC A B C A B C A B C A B C

Levels: A B C D E

> table(d)

d

 A  B  C  D  E

10 10 10  0  0

> table(d, exclude="B")

d

 A  C  D  E

10 10  0  0

 

函数lapply与函数sapply

lapply的使用格式为:

lapply(X, FUN, ...)

lapply的返回值是和一个和X有相同的长度的list对象,这个list对象中的每个元素是将函数FUN应用到X的每一个元素。其中XList对象(该list的每个元素都是一个向量),其他类型的对象会被R通过函数as.list()自动转换为list类型。

函数sapply是函数lapply的一个特殊情形,对一些参数的值进行了一些限定,其使用格式为:

sapply(X, FUN,..., simplify = TRUE,USE.NAMES = TRUE)

sapply(*, simplify = FALSE, USE.NAMES =FALSE)lapply(*)的返回值是相同的。如果参数simplify=TRUE,则函数sapply的返回值不是一个list,而是一个矩阵;若simplify=FALSE,则函数sapply的返回值仍然是一个list

示例代码:

> x <- list(a = 1:10, beta =exp(-3:3), logic = c(TRUE,FALSE,FALSE,TRUE))

> lapply(x, quantile)

$a

   0%   25%  50%   75%  100%

 1.00  3.25  5.50  7.7510.00

 

$beta

        0%        25%        50%        75%        100%

 0.04978707  0.25160736 1.00000000  5.05366896 20.08553692

 

$logic

  0%  25%  50%  75%100%

 0.0  0.0  0.5 1.0  1.0

 

> sapply(x,quantile,simplify=FALSE,use.names=FALSE)

$a

   0%   25%  50%   75%  100%

 1.00  3.25  5.50  7.7510.00

 

$beta

        0%        25%        50%        75%        100%

 0.04978707  0.25160736 1.00000000  5.05366896 20.08553692

 

$logic

  0%  25%  50%  75%100%

 0.0  0.0  0.5 1.0  1.0

#参数simplify=TRUE的情况

> sapply(x, quantile)

        a        beta logic

0%    1.00 0.04978707   0.0

25%   3.25 0.25160736   0.0

50%   5.50 1.00000000   0.5

75%   7.75 5.05366896   1.0

100% 10.00 20.08553692   1.0

函数mapply

函数mapply是函数sapply的变形版,mapply将函数 FUN依次应用每一个参数的第一个元素、第二个元素、第三个元素上。函数mapply的使用格式如下:

mapply(FUN, ..., MoreArgs = NULL, SIMPLIFY= TRUE,USE.NAMES = TRUE)

其中参数MoreArgs表示函数FUN的参数列表。

示例代码:

> mapply(rep, times=1:4, x=4:1)

[[1]]

[1] 4

 

[[2]]

[1] 3 3

 

[[3]]

[1] 2 2 2

 

[[4]]

[1] 1 1 1 1

 

#直接使用函数rep的结果:

> rep(1:4,1:4)

 [1] 1 2 2 3 3 3 4 4 4 4

 

11. fivenum函数和summary函数求出的分位数不同的解释

fivenum()是将一组数据分为上下两组(通过中位数计算,n=奇时,去掉中位数)然后再计算上下两组的中位数。而summary是通过计算quantle得出的。

 

12. 横式boxplot示例

Gen.city<-function(N){

    n= sample(2:15,N,replace = TRUE)

   re = data.frame(1:100)

   i=2

   for (u in n){

       name1<- sample(LETTERS,1)

       name2<- sample(c(letters,c(".",1:9)),u)

       name3 <- paste(c(name1,name2),collapse='')

       re<-cbind(re,rnorm(100)/u)

       names(re)[i]=name3

       i = i+1

    }

   re[,-1]

}

 

data = Gen.city(70)

 

X11()

par(las=2,mgp=c(4,.5,0),mar=c(5,5,2,1))

boxplot(data,

       horizontal=TRUE,

       cex.axis =.5,

       cex.lab = 1,

       ylab="City",

       xlab='Value',

       #col.lab = 'red',

       main="ABC result for XYZ")


 

13. 随机游走作图示例

set.seed(13579)

r=sample(c(-1,1),size=100,replace=TRUE,prob=c(1/2,1/2))

r=c(0,r)

w=cumsum(r)

w=as.ts(w)

plot(w,main="随机游走")

abline(h=0)


14. scan函数里面的flush的含义

> scan(flush=FALSE)

1: 11 22

3: 33

4: 

Read 3 items

[1] 11 22 33

> scan(flush=TRUE)

1: 11 22

2: 33

3: 

Read 2 items

[1] 11 33

flush=FALSE的时候,是依次计数,即输入几个数,就几次数。

> scan(flush=FALSE)

1: 11 22

3: 33

4: 

Read 3 items

[1] 11 22 33

flush=TRUE的时候,是按Enter计数,敲一次Enter记一次数。

15. table(x,y) 交叉列联表的含义

> x<-factor(c(1,1,2,2,3,3,4,4,5))

> y<-factor(c(2,2,3,3,4,5,7,8,9))

> table(x);table(y)

x

1 2 3 4 5

2 2 2 2 1

y

2 3 4 5 7 8 9

2 2 1 1 1 1 1

> table(x,y)

y

x 2 3 4 5 7 8 9

1 2 0 0 0 0 0 0

2 0 2 0 0 0 0 0

3 0 0 1 1 0 0 0

4 0 0 0 0 1 1 0

5 0 0 0 0 0 0 1

请问table(x,y)这个表中比如说第一行第一列的2第二行第二列的2表示什么啊?怎么个交叉法,求解答。

(x=1,y=2)共有两次。

0 0
原创粉丝点击