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

1.      使用rClr包访问.NET库

下载地址:http://r2clr.codeplex.com/

library(rClr)

clrLoadAssembly(‘c:/path/to/myassembly.dll‘)

myObj <-clrNew(‘MyNamespace.MyClass,MyAssemblyName‘)

clrCall(myObj, ‘SayHelloWorld‘)

2.      向C语言代码传递数据框参数示例

data.frame是一个list对象

#include <Rdefines.h>

SEXP df_fun(SEXP df)

{

int i, len = Rf_length(df);

SEXP result;

PROTECT(result = NEW_CHARACTER(len));

for (i = 0; i < len; ++i)

switch(TYPEOF(VECTOR_ELT(df, i))) {

case INTSXP:

SET_STRING_ELT(result, i, mkChar("integer"));

break;

case REALSXP:

SET_STRING_ELT(result, i, mkChar("numeric"));

break;

default:

SET_STRING_ELT(result, i, mkChar("other"));

break;

};

UNPROTECT(1);

return result;

}

然后使用 R CMD SHLIB来编译df_fun.c文件成库。

> dyn.load("df_fun.so")

> df=data.frame(x=1:5, y=letters[1:5],z=pi, stringsAsFactors=FALSE)

> .Call("df_fun", df)

[1] "integer""other"   "numeric"

在Rdefines.h文件中定义的宏GET_CLASS, GET_ATTR等,可以用来访问数据框的各种属性。

3.      通过代码获取帮助文件文本

hs <- help(survey)

tools:::Rd2txt(utils:::.getHelpFile(as.character(hs)))

Student Survey Data

Description:

This data frame containsthe responses of 237 Statistics I

students at the University of Adelaide to a number of questions.

Usage:

survey

Format:

The components of the data frame are:

‘Sex‘ The sex of thestudent. (Factor with levels ‘"Male"‘ and

‘"Female"‘.)

‘Wr.Hnd‘ span (distancefrom tip of thumb to tip of little finger

of spread hand) of writing hand, in centimetres.

‘NW.Hnd‘ span ofnon-writing hand.

‘W.Hnd‘ writing hand ofstudent. (Factor, with levels ‘"Left"‘ and

‘"Right"‘.)

‘Fold‘ "Fold yourarms! Which is on top" (Factor, with levels ‘"R

on L"‘, ‘"L on R"‘, ‘"Neither"‘.)

‘Pulse‘ pulse rate ofstudent (beats per minute).

‘Clap‘ ‘Clap yourhands!  Which hand is on top?‘ (Factor,with

levels ‘"Right"‘, ‘"Left"‘, ‘"Neither"‘.)

‘Exer‘ how often thestudent exercises. (Factor, with levels

‘"Freq"‘ (frequently), ‘"Some"‘,‘"None"‘.)

‘Smoke‘ how much the student smokes. (Factor, levels‘"Heavy"‘,

‘"Regul"‘ (regularly), ‘"Occas"‘ (occasionally),‘"Never"‘.)

‘Height‘ height of thestudent in centimetres.

‘M.I‘ whether the studentexpressed height in imperial

(feet/inches) or metric (centimetres/metres) units. (Factor,

levels ‘"Metric"‘, ‘"Imperial"‘.)

‘Age‘ age of the student inyears.

References:

Venables, W. N. and Ripley,B. D. (1999) _Modern Applied

Statistics with S-PLUS._ Third Edition. Springer.

4.      得到R环境的临时文件夹

tempdir()

[1]"C:\\Users\\sliu\\AppData\\Local\\Temp\\RtmpgJtwWX"

5.       计算Gradient向量和Hessian矩阵

函数的Gradient向量定义如下:

Hessian矩阵定义如下:

library(pracma)

dummy <- function(x) {

z<- x[1]; y <- x[2]

rez<- (z^2)*(y^3)

rez

}

grad(dummy, c(1,2))

[1] 16 12

hessian(dummy, c(1,2))

[,1] [,2]

[1,]  16   24

[2,]  24   12

6.       寻求帮助的包sos

sos包是专门用于查找R语言帮助信息的包,远比基础的help函数强大,查找范围包括所有的R语言包,比如搜索下面的信息,搜索结果会以网页的形式返回,其他更高级的使用方法请查看sos包的帮助文档。

library(sos)

???"Dickey-Fuller"

7.       只读取文件中的部分列

比如文件data.txt的内容如下,

"Year" "Jan" "Feb" "Mar""Apr" "May" "Jun" "Jul" "Aug""Sep" "Oct" "Nov" "Dec"

2009 -41 -27 -25 -31 -31 -39 -25 -15 -30-27 -21 -25

2010 -41 -27 -25 -31 -31 -39 -25 -15 -30-27 -21 -25

2011 -21 -27 -2 -6 -10 -32 -13 -12 -27 -30-38 -29

#我只希望读取前七列的数据,可以把不需要的列的类型设置为NULL

read.table("data.txt", colClasses =c(rep("integer", 7), rep("NULL", 6)),             header = TRUE)

Year Jan Feb Mar Apr May Jun

1 2009 -41 -27 -25 -31 -31 -39

2 2010 -41 -27 -25 -31 -31 -39

3 2011 -21 -27  -2  -6 -10 -32

8.       用rank函数实现并列排名

对如下向量,实现并列排名,即如果并列第一名有两个,则下一个是第三名。

x <- c(0.64, 0.64, 0.63, 0.62, 0.62, 0.62, 0.61, 0.6, 0.6, 0.58)

rank(-x, ties="min")

#[1]  1  1 3  4  4  4  7 8  8 10

9.       用split函数对数据框进行分组

df <- data.frame(ids=c(1,1,2,2,3),x=1:5,y=letters[1:5])

split(df, df$ids)

# $`1`

# ids x y

# 1   1 1 a

# 2   1 2 b

#

# $`2`

# ids x y

# 3   2 3 c

# 4   2 4 d

#

# $`3`

# ids x y

# 5   3 5 e

10. 字符形式的进度条

imax<-c(10)

#字符形式的进度条

pb <- txtProgressBar(min = 0, max = imax, style = 3)

for(i in 1:imax) {

Sys.sleep(1)

# 更新进度

setTxtProgressBar(pb, i)

}

cat("\n")

效果:

11. 用approxfun函数求出density函数曲线上的点坐标

dat<-c(5,7,4,6,4,3,55,6,7,5,4,3,33,44,5,2,33,22)

hist (dat,freq=FALSE)

d<-density(dat)

lines(d, col="red", lwd=2)

#get density function

dd<-approxfun(d$x, d$y)

#plot results

abline(v=mean(dat), lty=2)

points(0:60, dd(0:60), cex=1.2, pch=20, col="blue")

12. 趣味实现:生成乘法口诀表

#有很多种方法生成乘法口诀表,这里提供两例,第一例使用sapply和paste0函数;第二例使用#outer函数

例一:

A <- 1:9

B <- 1:9

FunOut <- function(x)

{

FunIn <- function(y)

{

paste0(x, ‘X‘,y,‘=‘,x * y)

}

sapply(B, FunIn)

}

AB <- sapply(A,FunOut)

例二:

outer(1:9, 1:9, function(X, Y) noquote(sprintf("%dX%d=%d",X, Y, X*Y)))

13. 在基础绘图包中,把坐标轴标签显示成两行

## data

N <- 10

dnow <- data.frame(x=1:N, y=runif(N), labels=paste("This is\nobservation ",1:N))

## make margins wide

par(mfrow=c(1,1), mar=c(10,10,6,4))

## plot without axix labels or ticks

with(dnow, plot(x,y, xaxt="n", xlab=""))

## the positions we ant to plot

atn <- seq(1,N,3)

## the label for these positions

lab <- dnow$labels[atn]

## plot the axis, but do not plot labels

axis(1, at=atn, labels=FALSE)

## plot labels

text(atn, ## x position

par("usr")[3]-.05, ## position of the low axis

srt=45, ## angle

labels=lab, ##labels

xpd=TRUE, ## allowsplotting outside the region

pos=2)

## par("usr")[3]

14. 使用rle函数统计字符的连续出现次数

a<-c(1,1,2,2,2,3,3,3,5,5,5,6,6,6)

rle(a)

#Run Length Encoding

#  lengths: int [1:5] 2 3 3 3 3

#  values : num [1:5] 1 2 3 5 6

结果解释,上面是计数,下面是字符,1两个,2三个,3三个,5三个,6三个

15. 利用parse函数和eval函数动态执行不同的运算符

parse函数可以解析字符串形式的表达式,并转化为expression类型,eval函数可以计算expression类型的表达式:

A <- 1

B <- 2

for(i in c(‘/‘,‘+‘,‘-‘,‘*‘))

{

S <- paste0(‘A‘, i,‘B‘)

print(S)

E <- parse(text = S)

print(E)

print(eval(E))

}

# [1] "A/B"

# expression(A/B)

# [1] 0.5

# [1] "A+B"

# expression(A+B)

# [1] 3

# [1] "A-B"

# expression(A-B)

# [1] -1

# [1] "A*B"

# expression(A*B)

# [1] 2

时间: 2024-10-26 01:38:00

R语言基础编程技巧汇编 - 25的相关文章

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

1.      监视R语言包更新状态的网站 R语言包的数量已经有近万个,及时关注新发布的包,以及已发布的包的更新状态,非常重要,下列网站提供了这个功能,读者可以经常访问: http://lib.stat.cmu.edu/R/CRAN/web/packages/available_packages_by_date.html 2.      使用命令行参数的R程序示例 以Windows系统为例,按照以下步骤: 1.    把Rscript.exe的路径加入到Path环境变量中,在我的机器上设置如下:

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

前 言 R语言是近年来迅速崛起的用于数据分析和数据挖据的编程语言,它由一批统计学家开发,进而广泛应用于各种需要进行统计分析的行业.在大数据时代,其优雅的编码风格.包罗万象的开发包.强大的数据处理能力,吸引了来自各个领域从事数据分析相关工作的人员. R语言是强大自由的,但是其学习曲线也是陡峭的.本人具有C/C++,C#,Python等多种语言的开发经验,就本人的体会,从R语言初级开发水平进阶到中级开发水平,要比其他编程语言更加困难,往往很多初学者就在这个阶段放弃了,相当可惜.另外,对于大量没有很多

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

1.      向量循环移位 library("magic") x <- 1:10 magic::shift(x,1) # [1] 10 1  2  3 4  5  6 7  8  9 magic::shift(x,1) # [1] 10 1  2  3 4  5  6 7  8  9 magic::shift(x,2) # [1] 9 10  1  2 3  4  5 6  7  8 magic::shift(x,3) # [1] 8  9 10  1 2  3  4 5  6

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

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_

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

1.       timestamp函数输出当前时间 timestamp() ##------ Sun Apr 05 20:54:06 2015 ------## 该函数可以输入当前的系统时间,可用于耗时很长的程序定时输出当前时间,用于判断程序是否正常运行:也可用于调试,判断哪一段代码效率较低. 2.       多个比较的boxplot图 a=c(1,2,3,4,5,2,1,2,4,2,5,6) b=c("A","A","B","B&

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

1.      利用magrittr包进行管道操作 很多情况下,管道操作符可以很大程度的简化代码,并且使其更加直观.易读.易懂,下面就简单说明了useR2014上颇受R用户喜爱的magrittr包. the pipe operatoris one (if not THE) most important innovation introduced, this year, to the Recosystem Intro 类似于linux中的|,可以把前一个表达式(函数)的输出(而不用定义中间变量来表

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

1.      注意在pdf中绘图,每次plot都要调用dev.off()关闭设备 for(i in 1:10) { pdf(paste(i,'plots.pdf',sep='')) plot(0) dev.off() } 上述代码中,如果dev.off移到循环外面,则只有最后的图能正常生成出来. 2.       read.table函数跳过空白行 read.table的skip参数可以设置跳过前面的n行,blank.lines.skip参数可以设置跳过完全空白的行. 3.      对box

c语言基础编程

作业: 1.二进制,八进制,十进制之间的相互转换 2.测试转义字符 3.测试强制类型转换 4.测试赋值运算符  = += -= *= /= %= <<= >>= ^= |= &= number += 2; 5.测试不同类型数字的运算(+ - * /)结果 6.从键盘输入一个实数,求其绝对值. 7.从键盘输入三个数,按升序输出. 8.已知方程 ax*x + bx + c = 0,输入a.b,求方程的根. 9.从键盘输入x,求y的值: y = 1  若 x > 0  0 

R语言基础

##数据获取 x1=round(runif(100,min=80,max=100)) x2=round(rnorm(100,mean=80, sd=7)) x3=round(rnorm(100,mean=80,sd=18)) x3[which(x3>100)]=100 num=seq(2005138101,length=100) x=data.frame(num,x1,x2,x3) write.table(x, "grade.txt") ##数据分析 y=read.table(&