1- 这篇笔记内容源于the art of programming,如果有python基础或者matlab基础,看起来应该会非常快而且简单
2-几个内置常用函数(写完觉得看起来有点乱)
help() #第一重要的函数,不会就help
AnyOfFunctionName #第二重要的,直接敲函数名,学习函数,直接看函数代码
x = c(1,2,3,4) #赋值方法1
x <- c(1,2,3,4) #赋值方法2
c(1,2,3,4) -> x #赋值方法3
x = c(x,5) #添加值
x = c(x[1:2],5x[3:4]) #插入值
x = x[-2:-3] #删除第二和第三个值
mean(x) #均值
sd(x) #标准差
sqrt(x) #开方
min(x) #最小值
max(x) #最大值
which.max(x) #最大值的位置
which.min(x) #最小值的位置
exp(x) #e幂次方
log(x) #求log
abs(x) #求绝对值
data() #打开选择内置数据集
rnorm(2) #产生2个正态分布的值
mean(Nile) #直接使用其中一个内置数据集求均值
hist(Nile) #绘制直方图
x <<- x+1 #影响全局,<<-符号相当于global
m = rbind(c(1,2),c(3,4)) #按行合并
m = cbind(c(1,2),c(3,4)) #按列合并
m * m #矩阵点乘
m %*% m #矩阵乘
x$u #类似于成员关系struct.member,R语言中list相当于c的struct
data = read.table("xx.txt",header = F) #读表格数据,无特征名字
class(m) #查询数据所属类型
str(m) #转换为字符类型
as.character(m) #转换为字符类型
as.numeric(m) #转换为数值类型
method(as) #查看所有的as方法
attribute(m) #查询矩阵维度
head(data) #查看data的前小部分数据
tail(data) #查看data的后小部分数据
length(data) #变量元素个数,字符串除外
y = vector(length = 2) #声明y为长度为2的向量
1:3 #产生1,2,3
1:3-1 #产生0,1,2
1:(3-1) #产生1,2
seq(1,6) #产生序列1,2,3,4,5,6
seq(1,6,2) #产生序列1,3,5
rep(3,4) #重复产生3,3,3,3
rep(1:3,2) #重复产生1,2,3,1,2,3
any(x>80) #只要x中元素有一个大于80,就是TRUE
all(x>80) #x所有元素大于80,才是TRUE
c(1,2)+c(1,2,3,4) #长度不一致向量相加,产生2,4,4,6,短的向量被重复利用,同理,四则运算一致,同理,可以把矩阵按列排成向量
z[-1:-3] #取z向量除了第一到第三个元素的其他元素
name(x) = c("sex","name","age") #给x各列元素添加特征名
x["name"] #当命名之后可以直接输出整列
x[1] #如果x已命名,输出该列包括名字(tag)
x[[1]] #如果x已命名,输出第一列的名字(tag)
round(x) #对x每个元素四舍五入
x = x[x*2 > 10] #滤波器,返回所有2倍x元素大于10的值
which(x*2 > 10) #滤波器,返回所有2倍x元素大于10的下标(位置)
y = x > 10 #对一个向量做判断,返回一个bool向量
x = ifelse(y%%2==0,2,1) #如果y是偶数,x=2,否则x=1
x = ifelse(k == 'M',1,ifelse(k == 'N',2,3)) #嵌套
m = matrix(c(1,2,3,4),2,2) #生成2行2列矩阵
m = matrix(0,3,3) #生成3行3列零矩阵
m1 = m[2,,drop = F] #获取m矩阵的第二行作为矩阵来处理,而不是向量
v = as.matirx(m) #把m向量处理成v矩阵
x = sort(x) #对x排序
union(x,y) #取并集
intersect(x,y) #取交集
setdiff(x,y) #x中有哪几个元素是y没有的
setdiff(y,x) #y中有哪几个元素是x没有的
combn(1:4,2) #1-4中两两组合的所有可能,生成matrix
#输入输出
#以下两个函数都可以传入文件名,读取文件
z = scan() #一直接收数值数据,直到2个回车
z = readline() #接收一行数据,包括数字空格字符
print(z) #单一输出z
sprintf("abc%dac",1) #像c语言一样格式化输出,结果abc1dac
cat(z,"123") #cat可以合并输出结果z 123
cat(z,"123",sep ='') #默认用空格连接,改成无字符连接,结果z123
#everything is object
ls() #查看所有使用中的对象
rm(x1,x2) #删除x1,x2对象
exists("data") #查看data这个对象存在与否
get("data") #获取data这个对象的内容
lines(x,y) #画折线
points(x,y) #在当前图画点
legend() #
text(x,y,"abc") #在当前图(x,y)位置添加文本abc
text(locator(1),"abc") #利用指示器点击任意位置添加文本abc
paste("num",1) #得到结果num 1(中间有空格)
paste("num",1,sep='') #得到结果num1
3-R几个常见概念
- session一次会话,当你保存一次会话使,生成一个Rdata文件,该会话存储了你在console敲的所有变量,当你加载了这个session就加载了所有存储的变量
- R的向量下标从1开始
- R的逻辑操作符 &与,|或,!非
- R语言apply用法:
- 在for循环中可以用 a in b,列举所有b的元素放到a,但是想要确定某个元素在不在b要用a %in% b,查看b里面有没有a。
4-R的DataFrame操作
x = data.frame(c(1,2),c('a','b'),stringAsFactors = F) #创建
names(x) = c('key','value') #命名
#其他操作类比list,好像没差
5-R读入数据进行统计
示例
y = factors(c('a','b','a','b','a'))
z = table(y)
#z
#a b
#3 2
as.vector(z)
#3 2
所以我们可以利用table函数对读入的数据进行统计
6-R解决线性方程组,有意思
a = matrix(c(1,1,-1,1),2,2)
b = c(2,4)
solve(a,b)
#3 1
#x-y=2 solve解方程, x=3
#x+y=4 y=1
7-R-OOP
#简单的定义一个类
setClass("myClass",
representation(
name = "character",
age = "numeric",
marriaged = "logical"
)
)
#创建一个对象实例
andy = new("myClass",name = "andy",age = 19,marriaged = T)
#访问对象成员
andy@age
#19
#我们敲入andy的时候会调用show()函数来显示,我们可以重写这个函数
setMethod("show","myClass",
function(object){
inOrOut = ifelse(object@marriaged,"is","is not")
cat(object@name,"is",object@age,"this year and",inOrOut,"marriaged!\n")
}
)
#andy
#andy is 19 this year and is marriaged!
#好玩吧
8-R线性回归简单举例
x = c(1,3,4)
y = c(1,5,9)
plot(x,y) #画出点图
lmr = lm(y~x) #y对x的线性回归
abline(lmr) #在原点图的基础上画出线性回归
#解释一下abline(c(2,1))对应画y=x+2的函数
9-R画三维图简单举例
library(lattice)
a = 1:10
b = 1:15
eg = expand.grid(x=a,y=b) #生成一个数据框架
eg$z = eg$x^2 +eg$x * eg$y #z = x^2 + x*y
wireframe(z~x+y,eg,shade = T) #画出了一个这样的平面
10-R语言提高执行速度(但是要注意,大部分情况下,time反比memory)
- 尽量使用向量计算,能不用循环就不用循环,因为在R语言里面“:”是调用函数的,“[”,“]”也是要调用函数的,所以在for循环里面要一直调用函数,降低执行速度。可以提高执行速度的向量化函数ifelse(),which(),any(),where(),all()。matrix也是一种特殊的向量
example:
#ORIGINAL
sum = 0
nreps = 100000
for(i in 1:nreps){
xy = rnorm(2)
sum = sum + max(xy)
}
print(sum/nreps)
#VERCTERIZE
nreps = 100000
yxmat = matrix(rnrom(2*nreps),ncol = 2)
maxs = pmax(xymat[,1],xymat[,2])
print(mean(maxs))
- 通过混合编程,用c编写函数,R来调用,或者在python里面调用R,都可以提高执行速度
- 并行处理,分为并行硬件和并行软件,这里介绍并行处理软件:
- 安装OpenMP、LAM或者MPICH2,R包Rmpi提供接口对MPI(message-passing interface)(具体操作步骤参考“the art of R programming -Chapter 17.2”)
- 重头戏,snow package,毕竟Rmpi的操作实在太复杂了,snow package运行速度在Rmpi之上,直接通过网络socket
cls = makeCluster(type = "SOCK",spec = c("PC48","PC49")) #以TCP/IP工作方式
#不使用snow
apply(a,1,"%*%",c(1,1))
#使用snow
parApply(cls,a,1,"%*%",c(1,1))
stopCluster(cls) #不用的时候退出
总之,snow包要好好学,好好用,要写也写不完。。。