您的位置:首页 > 编程语言

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

2015-04-08 20:25 543 查看

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.1Driver和RODBC包,本人操作系统是win7;

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

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

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

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

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

4、R语言中连接数据库:

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的每一个元素。其中X为List对象(该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)共有两次。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: