R语言常用函数

Python013

R语言常用函数,第1张

1. 判断存在:一个元素是不是在向量中用 a%in%b

>a="TT"

>b=c("AA","AT","TT")

>a %in% b

[1] TRUE

2. 判断某一元素这向量中的索引(第几个位置): index.TT=which(b==”TT”)

>index.TT=which(b=="TT")#index.TT是想知道的索引号,which是判断函数,b是想知道的元素所在的向量

>index.TT

[1] 3

3. 相当于 python 中的字典, names 函数

>b

[1] "AA" "AT" "TT"

>names(b)=c("geno1","geno2","geno3")#geno mean genotype

>names(b)

[1] "geno1" "geno2" "geno3"

>names(b)[1]

[1] "geno1"

>names(b)[1]="test"

>names(b)

[1] "test""geno2" "geno3"

>names(b)=NULL

>b

[1] "AA" "AT"

>b["geno2"]

"AT"

pop_name=c(“CEU”,"YRI")

names(pop_name)=c(1,2)

names(pop_name[1])=1

4. 去除某一元素: b[-index.nu]

#想去除元素”TT”,如果你不知道是第几个索引,可以先判断索引,再删除。

>b=c("AA","AT","TT")

>names(b)=c("geno1","geno2","geno3")

>index.TT=which(b=="TT")

>b=b[-index.TT]

>b

geno1 geno2

"AA""AT"

5. 相当于 Python 中的 set() 函数 和 count() 函数: unique() , table()

>b=c("TT","AT","AT","TT","AA")

>unique(b)#即相当于去除所有的重复,只保留一个

[1] "TT" "AT" "AA"

>table(b)#以元素为name,统计各元素的个数

b

AA AT TT

122

6. 字符串的分割: strsplit()

>test="AA"

>strsplit(test)

错误于strsplit(test) :缺少参数"split",也没有缺省值

>strsplit(test,split='')

[[1]]

[1] "A" "A"

>test=strsplit(test,split='')[[1]]

>test

[1] "A" "A"

7. 文本文档的写入: write.table()

write.table( res.matrix,file=new.file,sep='\t',quote=F,row.names=F,col.names=F,append=T)#quote=F去掉引号后写入,row.names=F去掉行的名字写入,否则会把名字写进去

##写入数据时候最好把数据存储成一个matrix然后直接写。要是每行每行写的话要注意数据的格式了。先建立一个空的matrix,见8,然后通过rbind或者cbind叠加上去。

方法一:

a=c()

b=c(“AA”,”TT”,”CC”)

for (i in 1:3){

a=c(a,b)

}

write.table(a,file=”test.txt”)#你会发现结果是

AA

TT

CC

….

##而且还有行和列的名字,因为没有设置参数。因为对于c向量来说,写的话默认是竖着写的,每个元素占一行。所以比较方便的就是rbind

方法二:

a=c()

b=c(“AA”,”TT”,”CC”)

for (i in 1:3){

a=rbind(a,b)

}

write.table(a,file=”test.txt”,quote=F,row.names=F,col.names=F)#你会发现结果是

AA TT CC

AA TT CC

AA TT CC

##原因是rbind把最总结果当做矩阵了。对于R数据的写入最好能生成最后的矩阵再写入。但是西面的梅一行写一次和方法二的效果是想通的,但是要用到append参数。

a=c()

b=c(“AA”,”TT”,”CC”)

for (i in 1:3){

a=rbind(a,b)

write.table(a,file=”test.txt”,quote=F,row.names=F,col.names=F,append=T)

}

8. 建立一个空的 matrix :

res.matrix <- matrix( ,nrow=0,ncol=6 )##这样就建立了一个0行6列的空matrix了。

9. 如何将 R 运行结果输出到文件

>x=read.table("F:/my/work/chengxu/PValue/pc2jieguo/pc2302.txt")

>z=t(x)

>ks.test(y,z)

Two-sample Kolmogorov-Smirnov test

data:y and z

D = 0.207, p-value <2.2e-16

alternative hypothesis: two-sided

如上面运行结果,我想将p-value <2.2e-16自动保存到一个文件中,如何用R程序实现,谢谢!

sink("output.txt")

print(ks.test(y,z)$p.value)

sink()

http://cos.name/cn/topic/16300

10 降序排列:

>a=c(1,1.2,0.1,4,5,-0.1)

>a=sort(a,decreasing=T)

>a

[1]5.04.01.21.00.1 -0.1

11. 取前1%的数

>a=c(1:10,4:20,1:100,1:1000)

>a=sort(a,decreasing=T)#先降序

>sig=a[round(length(a)*0.01)]

>sig

[1] 990

12.在shell中直接执行R脚本

R CMD BATCH --argstest.R

13. R中高级作图的方法

http://qizhi502.blog.163.com/blog/static/11497002520120611451736/

14:设置字体类型:

par(family='Times New Roman')

15:控制图形四周的空白大小

par(mfrow=c(3,1),mar=c(0,0,0,0))

其中mar是四周的间距,分别为x,y上下的距离

16控制作图区域的大小layout

layout(c(1,2,3),height=c(1,1,0.5))

分成竖着三份, 其中三份比列依次为(高度依次为2:2:1)

17保留两位小数

round(0.123,digits=2)

18 在原有图的基础上画图:

par(fig=c(0.1,0.5,0.43,0.65), new=TRUE)

19 只显示y轴

plot(1:10,1:10,axes=F)

axis(2,at.....)

20 调节刻度方向 las

plot(1:10,1:10,las=1)

21 屏幕分割

layout(matrix(1:16,4,4))###竖着plot

par(mfrow=c(4,4))##横着plot

22.逻辑表示或者

xor为异或,两值不等为真,两值相等为假。例:xor(0, 1)

23. 从向量中随机取几个数sample

sample(rep(1:1000),10)

23 字符串转换成小数浮点型

as.numeric("0.123")

24. 读取不规范的文本

f=readLines(afile,n=1)#n表示读几行

f=strsplit(f,'\t')##分割

f[1][[1]]##第一行

f[1][[1]][1]##第一行 第一个字符串

25. write 写入文件

write(afile, "a\tb\t",append=T) #沿着每行一次 写入

26. 不需要循环,这直接对matrix没行或者每列进行筛选操作apply()

apply(data,col2 or row1, max>0)

27.保留2位小数

a=2.300

a=as.numeric(sprintf(“%.3f”,a))

28。调出假设检验的p value

t.test(data1,data2)$p.value

udf_async_rbind <- function(path= "D:/R/oper_key_index/data/d_data/",

name= "移网线上单" ,

Date_temp = format(Date_stemp,"%Y%m%d"), # 直接引用变量不执行,需加函数转为常量

Date_last_month_day = ymd("2021-08-31") , # 函数内变量名不要与外部变量名重复

Date_last_month_day1= ymd("2021-07-31") ,

cols=190 ){

x <- udf_DT(paste0(path,name,Date_temp,".xlsx") , 1 ,0)

y <- udf_DT(paste0(path,name,format(Date_last_month_day,"%Y%m%d"),".xlsx"),1,0)

z <- udf_DT(paste0(path,name,format(Date_last_month_day1,"%Y%m%d"),".xlsx"),1,0)

if(ncol(x)>70){

x <- x[,1:cols]

y <- y[,1:cols]

z <- z[,1:cols]}else{print("全列导入")}

setnames(y,names(x))

table <- rbind(x, y)

return(table)

}

mob_dev_2ilist <- udf_async_rbind( name = "移网线上单" )

R语言数据集行列互换技巧

现在给大家介绍的数据处理技巧是长转宽,也就相当于Excel中的转置,不过用R语言实现的长转宽还有数据合并的功能,自然比Excel强大多了。

这里给大家介绍4个函数,其中melt()、dcast()来自reshape2包,gather()、spread()来自tidyr包

一、宽转长——melt()、gather()

[python] view plain copy

mydata<-data.frame(

name=c("store1","store2","store3","store4"),

address=c("普陀区","黄浦区","徐汇区","浦东新区"),

sale2014=c(3000,2500,2100,1000),

sale2015=c(3020,2800,3900,2000),

sale2016=c(5150,3600,2700,2500),

sale2017=c(4450,4100,4000,3200)

)

#宽转长——melt

mydata1<-melt(

mydata,

id.vars=c("address","name"),#要保留的主字段

variable.name = "Year",#转换后的分类字段名称(维度)

value.name = "Sale" #转换后的度量值名称

)

输出结果

[python] view plain copy

>mydata1<-melt(

+ mydata,

+ id.vars=c("address","name"),#要保留的主字段

+ variable.name = "Year",#转换后的分类字段名称(维度)

+ value.name = "Sale" #转换后的度量值名称

+ )

>mydata1

address name Year Sale

1普陀区 store1 sale2014 3000

2黄浦区 store2 sale2014 2500

3徐汇区 store3 sale2014 2100

4 浦东新区 store4 sale2014 1000

5普陀区 store1 sale2015 3020

6黄浦区 store2 sale2015 2800

7徐汇区 store3 sale2015 3900

8 浦东新区 store4 sale2015 2000

9普陀区 store1 sale2016 5150

10 黄浦区 store2 sale2016 3600

11 徐汇区 store3 sale2016 2700

12 浦东新区 store4 sale2016 2500

13 普陀区 store1 sale2017 4450

14 黄浦区 store2 sale2017 4100

15 徐汇区 store3 sale2017 4000

16 浦东新区 store4 sale2017 3200

再来看看gather()函数怎么用

[python] view plain copy

>#宽转长——gather

>mydata1<-tidyr::gather(

+ data=mydata,

+ key="Year",

+ value="sale",

+ sale2014:sale2017

+ )

>mydata1

name address Year sale

1 store1 普陀区 sale2014 3000

2 store2 黄浦区 sale2014 2500

3 store3 徐汇区 sale2014 2100

4 store4 浦东新区 sale2014 1000

5 store1 普陀区 sale2015 3020

6 store2 黄浦区 sale2015 2800

7 store3 徐汇区 sale2015 3900

8 store4 浦东新区 sale2015 2000

9 store1 普陀区 sale2016 5150

10 store2 黄浦区 sale2016 3600

11 store3 徐汇区 sale2016 2700

12 store4 浦东新区 sale2016 2500

13 store1 普陀区 sale2017 4450

14 store2 黄浦区 sale2017 4100

15 store3 徐汇区 sale2017 4000

16 store4 浦东新区 sale2017 3200

和melt()函数不同,gather()函数需要指定关键字段key,以及关键字段对应的值value,但是gather()函数更加好理解。

二、长转宽——dcast()和spread()

还是用上面的data1数据集,先来看看dcast()函数

[python] view plain copy

#长转宽——dcast

dcast(

data=mydata1,

name+address~Year

#左侧是要保留的字段,右侧是要分割的分类变量,列数等于表达式

#右侧分类变量的类别个数

)

[python] view plain copy

>#长转宽——dcast

>dcast(

+ data=mydata1,

+ name+address~Year

+ #左侧是要保留的字段,右侧是要分割的分类变量,列数等于表达式

+ #右侧分类变量的类别个数

+ )

Using sale as value column: use value.var to override.

name address sale2014 sale2015 sale2016 sale2017

1 store1 普陀区 3000 3020 5150 4450

2 store2 黄浦区 2500 2800 3600 4100

3 store3 徐汇区 2100 3900 2700 4000

4 store4 浦东新区 1000 2000 2500 3200

dcast()函数的使用规则需要琢磨下才能理解,大家好好看看注释部分,再来看看spread()

[python] view plain copy

#长转宽——spread

tidyr::spread(

data=mydata1,

key=Year,

value=sale

)

[python] view plain copy

>#长转宽——spread

>tidyr::spread(

+ data=mydata1,

+ key=Year,

+ value=sale

+ )

name address sale2014 sale2015 sale2016 sale2017

1 store1 普陀区 3000 3020 5150 4450

2 store2 黄浦区 2500 2800 3600 4100

3 store3 徐汇区 2100 3900 2700 4000

4 store4 浦东新区 1000 2000 2500 3200

直接调用tidyr::spread,需要指定关键字段key和对应的值value。

但是从理解上来看,我个人更喜欢tidyr包的函数,使用很清晰,大家可以根据实际情况自行选择,好啦,今天的分享结束,下次再见!