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

1.      读取压缩文件

con =gzfile("nm.1003a.443438.tar.gz");

readLines(con, n = 10);

close(con);

 

# 列举一个压缩包中有些什么文件(以及这些文件的大小日期等信息)

read.table(pipe("zcatnm.1003a.443438.tar.gz | tar -tv"))

# 读出压缩包中某一个文件的内容

readLines(pipe("zcatnm.1003a.443438.tar.gz | tar -xO ./nm.1003a.443438.log"))

# 更多用法和细节调整建议看看tar的帮助文档

2.      unique函数对数组的列进行筛选

a=matrix(c(1:6,1:3,1:3,4:6),nrow=3)

a

#    [,1] [,2] [,3] [,4] [,5]

#[1,]   1    4    1   1    4

#[2,]    2   5    2    2   5

#[3,]   3    6    3   3    6

unique(a,MARGIN=2)

#    [,1] [,2]

#[1,]   1    4

#[2,]   2    5

#[3,]   3    6

3.       注意默认的comment.char是#

默认条件下,#符号会被当成注释行的开始,这一行的内容会被忽略。例如,某文件内容如下,现在想把城市名读进来。

 

GDP   

#北京 

#上海 

#山东 

…… 

 

结果含有#字符变量的行被遗漏了,按上例读出来只有“GDP”一行。 需要设置read.table函数的comment.char参数。

4.       利用igraph包构造邻接矩阵

require(igraph)

x   = c(1, 1, 1, 3, 4, 5)

x   = data.frame(V1 = x[1:length(x) - 1], V2 = x[2:length(x)])

vert = data.frame(name=c('1', '2', '3','4', '5'))

y = graph.data.frame(x, vertices = vert)

V(y)$name = paste('A', 1:vcount(y), sep ='')

as.matrix(get.adjacency(y))

#   A1 A2 A3 A4 A5

# A1 2  0  1 0  0

# A2 0  0  0 0  0

# A3 0  0  0 1  0

# A4 0  0  0 0  1

# A5 0  0  0 0  0

 

5.       matrix和data.frame的本质

matrix本质是vector,它本来是一列数,但是带有dim属性,所以你看到的是矩形的数据。data.frame本质是list,只不过它的每个子元素的长度相同而已,所以你看到的是并排的矩形数据。

6.      merge与SQL中的JOIN对应关系

merge(a, b, by.x = “x1″, by.y = “x3″)这是inner join

merge(a, b, by.x = “x1″, by.y = “x3″, all.x= TRUE)这是left join

merge(a, b, by.x = “x1″, by.y = “x3″, all =TRUE)这是full join

 

7.      stripchart示例

A<-c(1,2,3,4,1,2,3,4,6,2,3,4,1,2,6,5,3,9,2,7,8,5,4,3)

stripchart(A, method ="stack",xaxt='n')

axis(1,at=seq(0,10,1))


8.       画U-matrix

require(kohonen)

data(wines)

wines = scale(wines)

set.seed(1001)

som.wines = kohonen::som(wines, grid = somgrid(10,15, "hexagonal"))

plot(som.wines, type ="dist.neighbours", palette.name = rainbow, ncolors = 200)


9.      随机行走示例一则

Plot.mat<-function(mat,type='b',lwd=2,xlab='',ylab='',main='',legend=c('',''),legend.x='bottomright',legend.y = NULL){

pop.nu<-nrow(mat)

nn<-apply(mat,1,range)

for (i in seq(pop.nu)){

if (i==1){

plot(mat[i,],col=rgb(i/pop.nu,i/pop.nu,0),xlim=c(1,ncol(mat)*1.2),ylim=c(min(nn[1,]),max(nn[2,])),type=type,lwd=lwd,xlab=xlab,ylab=ylab,main=main);

}else{

points(mat[i,],col=rgb(i/pop.nu,i/pop.nu,0),type=type,lwd=lwd)

}

}

    if(sum(legend=='')==0){

         #legend

         colcol<-cbind(1/pop.nu*(1:pop.nu),1/pop.nu*(1:pop.nu),rep(0,pop.nu));

         colcol<-rgb(colcol);

         legend(x=legend.x,y=legend.y,legend=legend,col=colcol,lty=1,lwd=2)

         }

}

mat<-matrix(rnorm(100),nrow=10)

Plot.mat(mat=mat,legend=as.character(1:10))


10. 利用optim和nlm函数求函数最小值示例

注意需要求解的函数的写法,传入参数是一个包含有多个参数的向量,要在函数内部将其一个个取出,不能整体使用.

f <- function(par)

{

  a<- par[1]    #Get the parameters

  b<- par[2]

  (a- 1) + 3.2/b + 3*log(gamma(a)) + 3*a*log(b);

}

 

> optim(c(1, .3), fn=f)

$par

[1] 1.399685 0.762025

 

$value

[1] 3.09904

 

$counts

function gradient

     55       NA

 

$convergence

[1] 0

 

$message

NULL

 

> nlm(f, c(1,.3))

$minimum

[1] 3.09904

 

$estimate

[1] 1.3999515 0.7619307

 

$gradient

[1] 3.096044e-07 3.907985e-07

 

$code

[1] 1

 

$iterations

[1] 17

11. 时间格式转换注意设置locale

中英文环境下时间格式是不同的,比如,查看strptime函数的帮助,可以发现%b是当前系统区域设置下的月份缩写,而月份缩写在中英文环境下是不同的:Jun是英文六月的缩写,‘六月’是中文六月的缩写。例如:

> as.Date('10-六月-98',format="%d-%b-%y")

[1] "1998-06-10"

> Sys.getlocale()

[1] "LC_COLLATE=Chinese_People'sRepublic of China.936;LC_CTYPE=Chinese_People's Republic ofChina.936;LC_MONETARY=Chinese_People's Republic ofChina.936;LC_NUMERIC=C;LC_TIME=Chinese_People's Republic of China.936"

当设置了合适的系统locale之后,系统才能懂得Jun的意思是六月:

> Sys.setlocale(,'C')

[1] "C"

> as.Date('10-六月-98',format="%d-%b-%y")

[1] NA

>as.Date('10-Jun-98',format="%d-%b-%y")

[1] "1998-06-10"

12. 动态生成函数示例

以下示例可以根据传入的参数n的值,动态生成不同的函数:

make_incrementor = function(n) return (function(x) x + n )

f = make_incrementor(42)

f(0)

f(1)

13. aperm函数的解释

问题:

x <- array(1:24, 2:4)

xt <- aperm(x, c(2,1,3))

在这个例子中aperm中的c(2,1,3)是什么意思?c(2,1,3)能不能变为c(2,1,4)之类的?aperm函数对参数有什么要求?

 

回答:

aperm函数用于重新设置高维数组的维度。其中,第一个参数是一个高维数组,第二个参数一定是1,2,3,4,…n的这些数字组成的向量,每个数字必须出现且只能出现一次,顺序可以打乱,其中n是高维数组的维度。1表示第一个维度,2表示第二个维度,…n表示第n个维度。

如果这样调用:

xt<-aperm(x, c(1,2,3))

则不会产生任何效果,因为维度顺序没有变化。

 

以上问题中的代码,x<-array(1:24,2:4),其中的2:4表示x是一个2X3X4的高维数组,所以,访问这个数组中的元素,需要三个下标:x[2][3][4]

然后,我们调用aperm函数来重新设置x的维度,其中c(2,1,3),表示把第二维和第一维换一个顺序,也就是要访问xt的元素,需要这样的三个下标:xt[3][2][4]

至于能不能用c(2,1,4),答案当然是不能,因为首先向量中缺少3,这个是不合法的(例如c(2,1,4,3)是合法的);另外,x只有三个维度,根本没有第四个维度。

14. 使用gregexpr函数让正则表达式匹配多次

gregexpr('c', 'abcdefcg')

[[1]]

[1] 3 7

attr(,"match.length")

[1] 1 1

attr(,"useBytes")

[1] TRUE

15. 坐标轴显示在图中间并从0点开始

plot(-5:5,abs(-5:5),axes=FALSE)

axis(1)

axis(2,pos=0)

box()


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值