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()