rownames表示行的名字。
R语言的特点:
R作为一种统计分析软件,是集统计分析与图形显示于一体的。
它可以运行于UNIX,Windows和Macintosh的 *** 作系统上,而且嵌入了一个非常方便实用的帮助系统。
R是自由软件。这意味着它是完全免费,开放源代码的。可以在它的网站及其镜像中下载任何有关的安装程序、源代码、程序包及其源代码、文档资料。
R是一种可编程的语言。作为一个开放的统计编程环境,语法通俗易懂,很容易学会和掌握语言的语法。
所有R的函数和数据集是保存在程序包里面的。只有当一个包被载入时,它的内容才可以被访问。
R具有很强的互动性。除了图形输出是在另外的窗口处,它的输入输出窗口都是在同一个窗口进行的,输入语法中如果出现错误会马上在窗口口中得到提示,对以前输入过的命令有记忆功能,可以随时再现、编辑修改以满足用户的需要。
如果加入R的帮助邮件列表一,每天都可能会收到几十份关于R的邮件资讯。可以和全球一流的统计计算方面的专家讨论各种问题,可以说是全世界最大、最前沿的统计学家思维的聚集地。
R是基于S语言的一个GNU项目,所以也可以当作S语言的一种实现,通常用S语言编写的代码都可以不作修改的在R环境下运行。
参考资料
R_(programming_language)Wikipedia[引用时间2018-1-4]
1 paste 函数
paste(v1,v2,sep="")
拼接对象是向量
2 rbind(df1,df2) 行合并
cbind(df1,df2) 列合并
3 merge 按共有变量进行合并(匹配)
merge(x,y,by=intersect(names(x),names(y)),byx=by, byy=y, all =FALSE, allx=FALSE,ally=FALSE,)
dimnames用list给予赋值即可。如dimnames=list(rownames,colnames,)。
R语言数组array函数:
数组是一个可以在两个以上的维度存储数据的R数据对象。例如 - 如果创建尺寸(2,3,4)的数组,那么创建4个矩形矩阵每2行3列。数组只能存储数据类型。使用 array()函数创建数组。它需要向量作为输入,并使用 dim 参数的值,以创建一个数组。
示例:
我们可以通过使用dimnames参数给予名称添加到数组中的行,列和矩阵。
# Create two vectors of different lengths
vector1 <- c(5,9,3)
vector2 <- c(10,11,12,13,14,15)
columnnames <- c("COL1","COL2","COL3")
rownames <- c("ROW1","ROW2","ROW3")
matrixnames <- c("Matrix1","Matrix2")
# Take these vectors as input to the array
result <- array(c(vector1,vector2),dim=c(3,3,2),dimnames = list(columnnames,rownames,matrixnames))
print(result)
当我们上面的代码执行时,它产生以下结果:
1 , , Matrix1
ROW1 ROW2 ROW3
COL1 5 10 13
COL2 9 11 14
COL3 3 12 15
2 , , Matrix2
ROW1 ROW2 ROW3
COL1 5 10 13
COL2 9 11 14
COL3 3 12 15
merge(x, y, by = intersect(names(x), names(y)), byx = by, byy = by, all = FALSE, allx = all, ally = all, sort = TRUE, suffixes = c("x","y"), incomparables = NULL, )
x,y:用于合并的两个数据框
by,byx,byy:用于连接两个数据集的列,intersect(a,b)值向量a,b的交集,names(x)指提取数据集x的列名 by = intersect(names(x), names(y)) 是获取数据集x,y的列名后,提取其公共列名,作为两个数据集的连接列, 当有多个公共列时,需用下标指出公共列,如names(x)[1],指定x数据集的第1列作为公共列 也可以直接写为 by = ‘公共列名’ ,前提是两个数据集中都有该列名,并且大小写完全一致,R语言区分大小写
all,allx,ally:指定x和y的行是否应该全在输出文件
sort:by指定的列是否要排序
suffixes:指定除by外相同列名的后缀
incomparables:指定by中哪些单元不进行合并
merge函数有4种匹配拼接模式,分别为inner,left,right和outer模式。 其中inner为默认的匹配模式。all=T代表全连接,allx=T代表左联结;ally=T代表右连接
inner 模式匹配,只显示两个数据集公共列中均有的行
outer 模式,将两张表的数据汇总,表中原来没有的数据置为空
left 匹配模式
right 匹配模式
setNames(stats)
setNames()所属R语言包:stats
Set the Names in an Object
设置对象的名称
译者:生物统计家园网 机器人LoveR
描述----------Description----------
This is a convenience function that sets the names on an object and returns the object It is most useful at the end of a function definition where one is creating the object to be returned and would prefer not to store it under a name just so the names can be assigned
这是一个方便的功能设置对象的名称,并返回对象。这是最有用的,其中一个是创建要返回的对象,宁愿不存储它只是一个名字下,这样的名字可以被分配一个函数定义结束。
在r中看函数源代码:
在R中,代码可以分为如下几个级别:
首先,是你输入了函数对象名称,你可以直接看到代码的,如要获得函数对象fivenum的代码,就只需要在Console中键入函数对象名称fivenum就可以得到如下结果:
function (x, narm = TRUE)
{
xna <- isna(x)
if (narm)
x <- x[!xna]
else if (any(xna))
return(repint(NA, 5))
x <- sort(x)
n <- length(x)
if (n == 0)
repint(NA, 5)
else {
n4 <- floor((n + 3)/2)/2
d <- c(1, n4, (n + 1)/2, n + 1 - n4, n)
05 (x[floor(d)] + x[ceiling(d)])
}
}
<environment: namespace:stats>
从上面的例子可以看出,这类函数对象的代码是最容易看到的,也是我们学习的最好的材料了,而R中最大多数的函数对象是以这种方式出现的。
其次,我们在输入mean这类函数名次的时候,会出现如下结果:
function (x, )
UseMethod("mean")
<environment: namespace:base>
这表示函数作者把函数“封”起来了。这个时候我们可以先试一试methods(mean),利用methods函数看看mean这个函数都有哪些类型的,我们得到的结果如下:
[1] meandataframe meanDate meandefault meandifftime meanPOSIXct meanPOSIXlt
其实对此可以有一个简单的理解,虽然不够精确。因为在R中,mean函数可以求得属于不同类型对象的平均值,而不同类型对象平均值的求法还是有一些小小差 异的,比如说求一个向量的平均值和求一个数据框的平均值就有所差异,就要编写多个mean函数,然后“封”起来,以一个统一的mean出现,方便我们使 用。这正好也反映了R有一种类似泛型编程语言的性质。
既然我们已经知道mean中还有这么多种类,我们可以输入meandefault试一试就可以得到:
function (x, trim = 0, narm = FALSE, )
{
if (!isnumeric(x) && !iscomplex(x) && !islogical(x)) {
warning("argument is not numeric or logical: returning NA")
return(asnumeric(NA))
}
if (narm)
x <- x[!isna(x)]
trim <- trim[1]
n <- length(x)
if (trim > 0 && n > 0) {
if (iscomplex(x))
stop("trimmed means are not defined for complex data")
if (trim >= 05)
return(stats::median(x, narm = FALSE))
lo <- floor(n trim) + 1
hi <- n + 1 - lo
x <- sortint(x, partial = unique(c(lo, hi)))[lo:hi]
n <- hi - lo + 1
}
Internal(mean(x))
}
<environment: namespace:base>
同样就可以得到meandataframe、meanDate、meandifftime、meanPOSIXct、meanPOSIXlt 的具体内容了。值得注意的是,在R中,出现有多个同样近似功能的函数封装为一个函数的时候(这时候在函数中多半会出现类似UseMethod函数使用的情 况),我们不妨先输入meandefault试一试。这种形式的函数在R中一般作为默认的函数表示。
第三,这是一种特殊的情况,有人认为应该和第二种是一类,但是我还是要提出来单独归类。在这种情况也和第二种的原因有些类似,但并不是完全一致。
也许我们大家都很熟悉plot函数了吧,输入函数名plot的时候,我们会得到如下结果:
function (x, y, )
{
if (isnull(attr(x, "class")) && isfunction(x)) {
nms <- names(list())
if (missing(y))
y <- {
if (!"from" %in% nms)
0
else if (!"to" %in% nms)
1
else if (!"xlim" %in% nms)
NULL
}
if ("ylab" %in% nms)
plotfunction(x, y, )
else plotfunction(x, y, ylab = paste(deparse(substitute(x)),
"(x)"), )
}
else UseMethod("plot")
}
<environment: namespace:graphics>
请注意plot函数中也出现了UseMethod这个函数,但是和mean不同的是,前面有相当多的语句用于处理其他一些事情。这个时候,我们也使用methods(plot)来看看,得到如下结果:
plotacf plotdataframe plotDate plotdecomposedts plotdefault
plotdendrogram plotdensity plotecdf plotfactor plotformula
plothclust plothistogram plotHoltWinters plotisoreg plotlm
plotmedpolish plotmlm plotPOSIXct plotPOSIXlt plotppr
plotprcomp plotprincomp plotprofilenls plotspec plotspeccoherency
plotspecphase plotstepfun plotstl plottable plotts
plottskernel plotTukeyHSD
不看不知道,一看吓一跳,还以为我们输入plot的输出就是函数本身,结果也许不是如此。可能有人已经理解了,其实最后的UseMethod函数实在默认的调用plotdefault函数,赶快再看看plotdefault函数吧,发现它再调用plotxy函数,再看看plotxy函数,再plotxy函数中调用了一个Internal(plotxy(xy, type, pch, lty, col, bg, cex, lwd, ))函数,也许这就是真正起作用的函数了吧。思路基本上就是如此了,是否这个时候您可以获得一些阅读查找R函数内容的乐趣。
除了直接输入FUNdefault形式外,还可以使用getS3method(FUN,"default")来获得代码。这样就解决了绝大多数函数代码查看的工作了。
在第二种情况种,我们说了一般可以通过FUNdefault获得想要的结果。但是只有称为generic的函数才有这种“特权”。而lm等则没有,不过我们也可以尝试使用methods(lm)来看看结果如何,发现:
[1] lmfit lmfitnull lminfluence lmwfit lmwfitnull
Warning message:
function 'lm' appears not to be generic in: methods(lm)
出现了警告信息,表示说lm不是泛型函数,但是还是给出了结果lmfit等,大致上可以看成是和lm相关的系列函数吧。这样子就出现了有趣的局面,比如说既有plotts,也有tsplot。
依照第三种情况,我们发现竟然有的函数用星号标识了的,比如plotstl等,当我们输入plotstl,甚至是plotstl的时候都会给出 要么找不到这个对象,要么干脆是代码错误的信息。原来凡是用了标识的函数,都是隐藏起来的函数,估计是怕被人看见(其实这是玩笑话)!我们要看这些函数 的代码,我们该怎么办呢?其实也很容易,使用功能强大的getAnywhere(FUN),看看这个函数的名称,就可以猜想到它的功能估计是很强大的, Anywhere的内容都可以找到!getAnywhere(plotstl)的结果如下:
A single object matching 'plotstl' was found
It was found in the following places
registered S3 method for plot from namespace stats
namespace:stats
with value
function (x, labels = colnames(X), setpars = list(mar = c(0,
6, 0, 6), oma = c(6, 0, 4, 0), tck = -001, mfrow = c(nplot,
1)), main = NULL, rangebars = TRUE, , colrange = "light gray")
{
sers <- x$timeseries
ncomp <- ncol(sers)
data <- drop(sers %% rep(1, ncomp))
X <- cbind(data, sers)
colnames(X) <- c("data", colnames(sers))
nplot <- ncomp + 1
if (rangebars)
mx <- min(apply(rx <- apply(X, 2, range), 2, diff))
if (length(setpars)) {
oldpar <- docall("par", aslist(names(setpars)))
onexit(par(oldpar))
docall("par", setpars)
}
for (i in 1:nplot) {
plot(X[, i], type = if (i < nplot)
"l"
else "h", xlab = "", ylab = "", axes = FALSE, )
if (rangebars) {
dx <- 1/64 diff(ux <- par("usr")[1:2])
y <- mean(rx[, i])
rect(ux[2] - dx, y + mx/2, ux[2] - 04 dx, y -
mx/2, col = colrange, xpd = TRUE)
}
if (i == 1 && !isnull(main))
title(main, line = 2, outer = par("oma")[3] > 0)
if (i == nplot)
abline(h = 0)
box()
right <- i%%2 == 0
axis(2, labels = !right)
axis(4, labels = right)
axis(1, labels = i == nplot)
mtext(labels[i], side = 2, 3)
}
mtext("time", side = 1, line = 3)
invisible()
}
<environment: namespace:stats>
注意到前面有一段解释型的语言,描述了我们要找的这个函数放在了什么地方等等。其实对任意我们可以在R中使用的函数,都可以先试一试getAnywhere,看看都有些什么内容。算是一个比较“霸道”的函数。
在上面plotxy函数中,我们还可以看到Internal这个函数,类似的也许还可以看到Primitive、External、Call等函数这就和R系统内部工作方式和与外部接口的定义有关了,如果对这些函数有兴趣的话,就要学习组成R系统的源代码了。
最后,如果真的想阅读组成R系统本身的源代码,在各个CRAN中均有下载。你可以得到组成R系统所需要的材料。其中很多C语言(还有就是F)的源代码,均 是精心挑选过的算法,哪怕就是想学从头到尾编写具体的算法,也是学习的好材料。同时,你可以看到R系统内部是如何构成的,理解了这些对于高效使用R有至关 重要的作用。这个范畴的材料就要着重看一看R-Lang和R-inits了。
至此,R中阅读代码的内容就依照我的理解介绍了一下。随后将有一些R代码示例的分析注解、语言本身、R应用的和行业使用的材料翻译和具体例子说明。欢迎大家多多和我交流,一起进步。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)