R语言-实用功能性语句3

目录概览

1)R取值有技巧,drop选项巧帮助

2)R中逻辑运算符(logical operator)

3)递归

4)R图例空元素,0和NA来代替

5)字符串转代码很容易,eval()/parse()很随意

6)factor如需换标签,c()函数有妙招

7)操作符也是函数,使用起来有妙招

8)输出table有引号,quote参数来帮忙

9)比较两个元素identical()

10)压缩list用do.call()

11)分割数据使用split()

12)输出txt文档找sink()

13)R中循环for妙用

14)多个序列取交集并集用Reduce()

15)载入github储存的R代码使用source_url

16)重新命名 data.frame 的行或列

17)设置高维数组的名字

18)批量安装R包

19)R批量读取csv文件

20)R批量导出csv文件

21)语句21

22)语句22

23)语句23

24)语句24

25)语句25

26)语句26

27)语句27

28)语句28

29)语句29

30)语句30


1)R取值有技巧,drop选项巧帮助

  当对象是一个矩阵的时候,通常我们要获取其中一些元素。如果取出的正好是一行或者一列,此时,R会返回给我们一个向量,而不是矩阵。这会带来很大的麻烦,因为我们必须判断返回对象是向量,还是矩阵,才能继续下面的操作。此时,drop可以帮助我们,如果设置drop = FALSE,就会保持原样返回结果。

	> b <- matrix(1:6, nrow = 2, ncol = 3)
	> b
	     [,1] [,2] [,3]
	[1,]    1    3    5
	[2,]    2    4    6
	> b[, 3]
	[1] 5 6
	> b[, 3, drop = FALSE]
	     [,1]
	[1,]    5
	[2,]    6
	> b[1, , drop = FALSE]
	     [,1] [,2] [,3]
	[1,]    1    3    5

2)R中逻辑运算符(logical operator)

  在R中,逻辑运算符(logical operator)有 !, &, &&, |, ||, xor, is TRUE等等。

  问题:&与&&, |与||有什么区别呢?它们是否是一致的呢?

  答:否。我们将&和|称为短逻辑符,&&及||称为长逻辑符。长逻辑符只比较左边和右边的第一个元素,而短逻辑符会比较所有的。我们来看示例:

  R中的逻辑运算符号有两组,|或者||(&或者&&),看起来觉得有些多余。其实,这是为了R独特的“向量运算”考虑的。|或者&首先考虑返回一个向量,而||和&&则只返回最后一个值。比如:

	> c(FALSE, TRUE) | c(FALSE, FALSE)
	[1] FALSE  TRUE
	> c(FALSE, TRUE) || c(FALSE, FALSE)
	[1] FALSE

	> a<-c(TRUE, FALSE, TRUE, FALSE)
	> b<-c(FALSE, FALSE, TRUE, TRUE)
	> c<-c(TRUE, FALSE, FALSE, FALSE)
	> a & b
	[1] FALSE FALSE  TRUE FALSE
	> a && b
	[1] FALSE
	> a & c
	[1]  TRUE FALSE FALSE FALSE
	> a && c
	[1] TRUE
	> a | b
	[1]  TRUE FALSE  TRUE  TRUE
	> a || b
	[1] TRUE
	> a | c
	[1]  TRUE FALSE  TRUE FALSE
	> a || c

3)递归

  R在解释代码时,不支持尾递归优化,所以在R中不要写递归。

4)R图例空元素,0和NA来代替

  在R绘图的图例中,通常需要“线条”和“点”分开单独表示,这里用到0和NA的小技巧。如果在legend()函数函数中,pch = NA表示没有点,lty=0表示没有线条。

5)字符串转代码很容易,eval()/parse()很随意

  如果我们有一个字符字符串,现在需要将其转为可执行代码。方法如下:

	> test1 = '1:3'
	> test1
	[1] "1:3"
	> eval(parse(text = test1))
	[1] 1 2 3

6)factor如需换标签,c()函数有妙招

  如果我们需要对一个factor的标签(label)进行转换,并且返回一个向量,有两种方法可以使用:

  • 第一种方法,使用c()函数

      > tmp1 <- factor(rep(1:3, each = 3))
      > tmp1
      [1] 1 1 1 2 2 2 3 3 3
      Levels: 1 2 3
      > c(letters[1:3])[tmp1]
      [1] "a" "a" "a" "b" "b" "b" "c" "c" "c"
    
  • 第二种方法,先转换标签,之后再使用as.character()函数。

      > tmp2 <- factor(tmp1, labels = letters[1:3])
      > tmp2
      [1] a a a b b b c c c
      Levels: a b c
      > as.character(tmp2)
      [1] "a" "a" "a" "b" "b" "b" "c" "c" "c"
    

7)操作符也是函数,使用起来有妙招

	> "+"(1, 2)
	[1] 3
	> '>'(1, 2)
	[1] FALSE
	> tmp1 = list()
	> for(i in 1:10)
	  tmp1[[i]] = i:(i+1)
	> tmp1
	[[1]]
	[1] 1 2
	
	[[2]]
	[1] 2 3
	
	[[3]]
	[1] 3 4
	
	[[4]]
	[1] 4 5
	
	[[5]]
	[1] 5 6
	
	[[6]]
	[1] 6 7
	
	[[7]]
	[1] 7 8
	
	[[8]]
	[1] 8 9
	
	[[9]]
	[1]  9 10
	
	[[10]]
	[1] 10 11
	> sapply(tmp1, '[[', 2)
	 [1]  2  3  4  5  6  7  8  9 10 11

  最后一个例子中,使用了[[,巧妙地取得了第二个元素。

8)输出table有引号,quote参数来帮忙

  在使用write.table()命令输入一个data.frame对象时候,输入文件会加引号。这时,设定quote参数,write.table(..., quote = FALSE)

9)比较两个元素identical()

10)压缩list用do.call()

	do.call(rbind, list)

11)分割数据使用split()

	> test1 <- rep(c('**a', 'b'), c(3, 4))
	> test1
	[1] "a" "a" "a" "b" "b" "b" "b"
	> split(test1, factor(test1))
	$a
	[1] "a" "a" "a"
	
	$b
	[1] "b" "b" "b" "b"

12)输出txt文档找sink()

  sink()可以将R的对象输出到外部文档中,第一遍可能包括了系统信息,需要输出第二遍。一个典型的流程如下:

	> sink(filename)
	> test1
	> sink()

13)R中循环for妙用

  R中for循环中,需要指定一个计数器,比如i in 1:10之类。R可以直接将一个向量用于计数,返回向量中对应的值,比如:

	> tmp1 <- letters[1:10]
	for (i in tmp1) {
	  print(i)
	}
	> [1] "a"
	[1] "b"
	[1] "c"
	[1] "d"
	[1] "e"
	[1] "f"
	[1] "g"
	[1] "h"
	[1] "i"
	[1] "j"

14)多个序列取交集并集用Reduce()

	> Reduce(union, list(letters[1:3], letters[1:4], letters[1:5]))
	[1] "a" "b" "c" "d" "e"

15)载入github储存的R代码使用source_url

  需要安装和调用devtools

	# Load the R code from web url
	
	> library(devtools)
	> source_url('https://raw.githubusercontent.com/YulongNiu/FunFunc/master/test_two_proportion.R')

16)重新命名 data.frame 的行或列

	x <- mtcars
	head(x)
	# 将行名改成序号
	rownames(x) <- 1:nrow(mtcars)
	head(x)
	# 将列名改成序号(方法1)
	colnames(x) <- 1:ncol(mtcars)
	head(x)
	# 将列名改成序号(方法2)
	names(x) <- 1:ncol(mtcars)
	head(x)

17)设置高维数组的名字

	ar <- array(data=1:27,dim=c(3,3,3),
				dimnames=list(c("a","b","c"),c("d","e","f"),c("g","h","i"))
	)
	ar
	#或者
	dimnames(ar)[[3]] <- c("G","H","I")
	ar
	
	> 
	> ar <- array(data=1:27,dim=c(3,3,3),
	+ dimnames=list(c("a","b","c"),c("d","e","f"),c("g","h","i"))
	+ )
	> ar
	, , g
	
	  d e f
	a 1 4 7
	b 2 5 8
	c 3 6 9
	
	, , h
	
	   d  e  f
	a 10 13 16
	b 11 14 17
	c 12 15 18
	
	, , i
	
	   d  e  f
	a 19 22 25
	b 20 23 26
	c 21 24 27
	
	> #或者
	> dimnames(ar)[[3]] <- c("G","H","I")
	> ar
	, , G
	
	  d e f
	a 1 4 7
	b 2 5 8
	c 3 6 9
	
	, , H
	
	   d  e  f
	a 10 13 16
	b 11 14 17
	c 12 15 18
	
	, , I
	
	   d  e  f
	a 19 22 25
	b 20 23 26
	c 21 24 27
	
	> 

18)批量安装R包

	#批量运行包:
	all.pcg <- c("data.table","ggplot2","rmarkdown","tidyr","stringr","ggfortify") 
	sapply(all.pcg, library, character.only = T) 
	req.pcg <- function(pcg){ 
	new <- pcg[!(pcg %in% installed.packages()[, "Package"])] 
	if (length(new)) install.packages(new, dependencies = T) 
	sapply(pcg, require, ch = T) 
	} 
	req.pcg(all.pcg)

19)R批量读取csv文件

批量读取数据,有两种形式,读取一个目录下的所有文件,从数据库中读取多个表。

  • 1.读取方式

      ##读取同一目录下的所有文件
      path <- "F:/Rfile/OD-B/Data" ##文件目录
      fileNames <- dir(path)  ##获取该路径下的文件名
      filePath <- sapply(fileNames, function(x){ 
                       paste(path,x,sep='/')})   ##生成读取文件路径
      data <- lapply(filePath, function(x){
                   read.csv(x, header=T)})  ##读取数据,结果为list
      
      ##从数据库中读取数据类似上面,获取要数据库里的文件名,写个正则筛选文件名后for循环读取。
    
  • 2.读取方式

批量读入就是“在一个循环里一个一个读”。如果你要读取的csv内容格式相同,即所有数据汇总到一个dataframe中,可以:

	filenames <- list.files("~/你的文件夹.../", pattern = ".csv") 
	n <- length(filenames) 
	dat <- data.frame() 
	for (i in 1:n) { 
		dat <- rbind(dat, read.csv(filenames[i])) 
	}
  • 3.读取方式

如果需要读的csv内容格式不同,则可以作为list存储:

	filenames <- list.files("~/你的文件夹.../", pattern = ".csv") 
		datalist <- lapply(filenames, function(name) { 
		read.table(paste("~/你的文件夹.../", name, sep = "")) 
	})
  • 4.读取方式

      getwd()
      list.files()
      files_full <- list.files( , full.names = TRUE)
      dat <- data.frame()
      for (i in 1:300) {
      	dat <- rbind(dat, read.csv(files_full[i]))
      }
    

R语言是函数式编程语言。在函数式编程语言中,大部分情况可以不用for循环。

	files <- list.files(directory)
	data <- lapply(files, function(file) {
		read.csv(paste0(directory, file), stringsAsFactors = FALSE)
	})
	data_cbind <- Reduce(cbind, data)

20)R批量导出csv文件

对结果批量输出csv文件,其中data为list格式

	outPath <- "F:/Rfile/OD-B/Consequence" ## 输出路径
	out_fileName <- sapply(names(data),function(x){
	                    paste(x, ".csv", sep='')}) ##csv格式
	out_filePath <- sapply(out_fileName, function(x){
	                     paste(outPath ,x,sep='/')}) ##输出路径名
	## 输出文件
	for(i in 1:length(data)){
	  write.csv(data[[i]], file=out_filePath[i], row.name=F) 
	}

21)语句21

22)语句22

23)语句23

24)语句24

25)语句25

26)语句26

27)语句27

28)语句28

29)语句29

30)语句30

Genolini-S4tutorialV0-5en

posted @ 2017-07-16 17:09  银河统计  阅读(699)  评论(0编辑  收藏  举报