R语言︱函数、循环、if族/for、switch、repeat——function结合

后续加更内容:

应用一:if族有哪些成员呢?——if/ifelse/stopifnot

————————————————————————————————————

1、循环

##循环for
iris
allzl=unique(iris$setosa)
for (i in 1:2){
  pp=iris[iris$setosa==allzl[i],]
  plot(pp$Sepal.Length~pp$Sepal.Width)
}

for循环中,需要将数值组合起来,如果数据整齐可以用matrix;如果不整齐,用list,不等长合并的时候,rbind.fill函数可以很好将数据进行合并,并且补齐没有匹配到的缺失值为NA。

可参考:

R语言︱list用法、批量读取、写出数据时的用法


案 例

temp<-matrix(data = NA,181,31)
for (i in 1:31){
  temp[,i]<-filter(data[i]/7, rep(1, 7))
  }
yatmdata<-data.frame(temp)

代码利用matrix先定义一个181*31的空值矩阵,然后往里面灌数字。

2、switch分支语句

##switch分支语句
switch(1,mean(1:10),rnorm(4))  #执行mean(1:10)
switch(2,mean(1:10),rnorm(4))  #执行rnorm(4)
#由switch(x)来选择执行那个函数

3、while循环语句

注意执行顺序,先执行f[i]+f[i+1]<1000,然后往下走,与下面repeat有区别

##while循环语句
#计算斐波那契数列
f=1
f[2]=1
i=1
while(f[i]+f[i+1]<1000){
  f[i+2]=f[i]+f[i+1]
  i=i+1
}
f
#注意执行顺序,先执行f[i]+f[i+1]<1000,然后往下走,与下面repeat有区别

4、repeat循环

常常与if联用。

##repeat语句
#计算斐波那契数列
f=1
f[2]=1
i=1
repeat{
  f[i+2]=f[i]+f[i+1]
  i=i+1
  if (f[i]+f[i+1]>1000) break
};f
#与if常常联用,注意执行顺序,f[i]+f[i+1]>1000,与while<1000不同

与if常常联用,注意执行顺序,f[i]+f[i+1]>1000,与while<1000不同。

5、if函数+function

if和while都是需要数据TRUE/FALSE这样的逻辑类型变量,这就意味着,if内部,往往是对条件的判别,例如 is.na, is.matrix, is.numeric等等,或者对大小的比较,如,if(x > 0), if(x == 1), if(length(x)== 3)等等。

if后面,如果是1行,则花括号可以省略,否则就必须要将所有的语句都放在花括号中。这和循环是一致的

fun.test <- function(a, b, method = "add"){
    if(method == "add") { ## 如果if或者for/while;
        res <- a + b       ## 等后面的语句只有一行,则无需使用花括号。
}
    if(method == "subtract"){
        res <- a - b
    }
    return(res)           ## 返回值
}
### 检验结果
fun.test(a = 10, b = 8, method = "add")
fun.test(a = 10, b = 8, method = "substract")

同时if还有类似与excel的用法——ifelse

ifelse(Age > 30, "Old", "Young")

Age变量>30,则输出old;<30,输出Young

————————————————————————————————————————————————————————————

Function与循环函数结合的实践案例

1、函数如何输出?——print、return&list

如果是单个输出,直接用1.3方法即可

如果有很多输出项目,那么需要return(终止运算,并输出return中的项目)最终输出的项目

R中默认的情况是将最后一句作为返回值。

1.1 return&list组合

return和list的组合输出结果比较合理。(来自R语言︱噪声数据处理、数据分组——分箱法(离散化、等级化)

[html] view plain copy

print?

  1. sbdeep=function(data,parts,xiaoz){
  2. parts<-parts         #分几个箱
  3. xiaoz<-xiaoz         #极小值
  4. value<-quantile(data,probs = seq(0,1,1/parts))  #这里以data等比分为4段,步长为1/4
  5. number<-mapply(function(x){
  6. for (i in 1:(parts-1))
  7. {
  8. if(x>=(value[i]-xiaoz)&x<value[i+1])
  9. {
  10. return(i)
  11. }
  12. }
  13. if(x+xiaoz>value[parts])
  14. {
  15. return(parts)
  16. }
  17. return(-1)
  18. },data)
  19. #打标签L1L2L3L4
  20. return(list(degree=paste("L",number,sep=""),degreevalue=number,value=table(value),number=table(number)))               #将连续变量转化成定序变量,此时为L1,L2,L3,L4...根据parts
  21. }

该函数是对单个序列数据进行等深分箱,可以返回四类:

一个基于L1L2L3....的每个指标标签序列degree;

标签序列值degreevalue,

每个百分位数对应的变量值value,

不同百分点的数量number。

1.2 print直接输出

  function(){
    print(plot(cv.out))
  }

print可以直接输出.

1.3 直接输出——一一般都是直接输出

function(){
a=c(1:50)
a
}

其中a就是直接写在末尾,当做输出项。

2、function中应用if switch函数

test=function(mode=c("all", "out", "in")){
  mode <- switch(mode, out = 1, `in` = 2, all = 3)

  if (as.numeric(mode)==1) {
    t=1
  }

  if (as.numeric(mode)==2) {
    t=2
  }

  if (as.numeric(mode)==3) {
    t=3
  }
  t=t+1
  return(t+4)
}
a=test(mode="out")

test(mode="in")

test(mode="all")

解决场景:编写函数时候,可能嵌套很多模型的时候,就需要用这个流程。

switch函数,输入mode,执行相应的内容,此时是mode选择“all”,则执行返回1,;mode选择"out"则返回2;

然后用if去进行每个数字背后的建模,注意“==”
"in"注意要引号,因为会跟内嵌函数重叠

3 异常值处理——如何报错

  # 异常处理,当仅输入一个数据的时候,告知不能计算标准差
   if(length(x) == 1){
      stop("can not compute sd for one number,
           a numeric vector required.\n")
   }

————————————————————————————————————

应用一:if族有哪些成员呢?——if/ifelse/stopifnot

在函数中,if的应用场景非常多,用来识别某类情况前提下,再执行下一个。

其中笔者就见过这样三类if:if-else   ifelse   stopifnot

1、if-else

这个很常见,就是需要注意一下,if-else的写法,来看经管之家论坛一位坛友的提醒与使用心得:

if(){}else{}  表示先执行if括号后面的条件语句,如果正确就执行第一个大括号里的程序,如果错误就执行else后面大括号里的语句。
      有一种情况,r会报错:

if(){}
else{} 

就是这种情况,即else语句换了一行执行时,这是r会认为if语句已经执行完毕,但执行else发现前面无法执行,因此报错,在这里要提醒使用r的同志们,else必须紧挨着if语句后的大括号,这时才不会出错。

2、ifelse

跟If-else其实是一模一样的,但是效率提高很多,是提高代码运算效率很高的函数。ifelse()的句法格式类似于if()函数,但其运算速度却有了巨大的提升。即使是在没有预设数据结构且没有简化条件语句的情况下,其运算效率仍高于上述的两种方法。

ifelse(test, yes, no)

ifelse返回的是结果,有一点麻烦的是,不像if-else一样,可以写一些分布计算的东西,譬如现在有以下一种情况:

a<-c+d
sum(a>2)  #在c大于2的情况下,要计算a大于2的个数

这个分步情况在if-else里面很好解决,但是在ifelse里面可不容易,只能接受一步,所以尽量把运算链合并在一起。

3、stopifnot

这个函数跟Ifelse有点像,但是很奇特。stopifnot(c>2),如果正确执行,那么就会啥都没发生,如果错误了,就会跳入Debug模式,报错,让函数立刻停下来。

这个stopifnot跟trycatch函数联合使用,威力无比。

用tryCatch跳过:

[html] view plain copy

print?

  1. result = tryCatch(
  2. {expr},
  3. warning = function(w) {warning-handler-code},
  4. error = function(e) { error-handler-code},
  5. finally = {cleanup-code}
  6. )

出现warning、error时候怎么处理,就可以跳过了。例子:

[html] view plain copy

print?

  1. result = tryCatch(
  2. {segmentCN(txt)},
  3. warning = function(w) {"出警告啦"},
  4. error = function(e) { "出错啦"},
  5. )

分词时候,容易因为Lapply中断之后,就不会运行了,这样功亏一篑所以可以用这个办法跳过。

时间: 2024-12-29 11:13:17

R语言︱函数、循环、if族/for、switch、repeat——function结合的相关文章

R语言函数

函数是一个组织在一起的一组以执行特定任务的语句.R语言有大量的内置函数,用户也可以创建自己的函数. 在R语言中的函数是一个对象,所以R语言解释器为能够通过控制到该函数,带有参数可能是函数必要完成的操作. 反过来函数执行其任务,并将控制返回到其可以被存储在其它的目的解释器以及任何结果. 函数定义 R函数是通过使用关键字 function 来创建.R函数的定义基本语法如下: function_name <- function(arg_1, arg_2, ...) { Function body }

R语言函数union、setdiff、insect

union 求两个向量的并集 集合可以是任何数值类型 union(x=1:3, y=2:5) [1] 1 2 3 4 5 union(x=c("abc", "12"), y=c("bcd", "efg")) [1] "abc" "12" "bcd" "efg" setdiff 求向量x与向量y中不同的元素(只取x中不同的元素) setdiff(x,

R语言︱机器学习模型评估方案(以随机森林算法为例)

R语言︱机器学习模型评估方案(以随机森林算法为例) 笔者寄语:本文中大多内容来自<数据挖掘之道>,本文为读书笔记.在刚刚接触机器学习的时候,觉得在监督学习之后,做一个混淆矩阵就已经足够,但是完整的机器学习解决方案并不会如此草率.需要完整的评价模型的方式. 常见的应用在监督学习算法中的是计算平均绝对误差(MAE).平均平方差(MSE).标准平均方差(NMSE)和均值等,这些指标计算简单.容易理解:而稍微复杂的情况下,更多地考虑的是一些高大上的指标,信息熵.复杂度和基尼值等等. 本篇可以用于情感挖

R语言快速入门--从最基本的功能讲起

最近因为一些特殊的原因,开始接触R语言.越学越发现R语言的强大,原来完成一件事情是如此的简单.R语言中提供的工具和方法极大的方便了对一些数据的分析和处理的工作.对于一个要立志从事数据分析或者数据挖掘的学生或者工程师来说,学习R语言,确实可以达到如虎添翼的效果. R语言有如下特点: 1. 有效的数据处理和保存机制: 2. 拥有一整套的数组和矩阵操作运算符: 3. 一系列连续而又完整的数据分析工具: 4. 图形统计可以直接对数据进行分析和显示,可用于多种图形设备: 5. R语言是一种相当完善.简洁和

R 语言实现求导

前言 高等数学是每个大学生都要学习的一门数学基础课,同时也可能是考完试后最容易忘记的一门知识.我在学习高数的时候绞尽脑汁,但始终都不知道为何而学.生活和工作基本用不到,就算是在计算机行业和金融行业,能直接用到高数的地方也少之又少,学术和实际应用真是相差太远了. 不过,R语言为我打开了一道高数应用的大门,R语言不仅能方便地实现高等数学的计算,还可以很容易地把一篇论文中的高数公式应用于产品的实践中.因为R语言我重新学习了高数,让生活中充满数学,生活会变得更有意思. 本节并不是完整的高数计算手册,仅介

R语言的导数计算(转)

转自:http://blog.fens.me/r-math-derivative/ 前言 高等数学是每个大学生都要学习的一门数学基础课,同时也可能是考完试后最容易忘记的一门知识.我在学习高数的时候绞尽脑汁,但始终都不知道为何而学.生活和工作基本用不到,就算是在计算机行业和金融行业,能直接用到高数的地方也少之又少,学术和实际应用真是相差太远了. 不过,R语言为我打开了一道高数应用的大门,R语言不仅能方便地实现高等数学的计算,还可以很容易地把一篇论文中的高数公式应用于产品的实践中.因为R语言我重新学

R语言中的循环函数(Grouping Function)

R语言中有几个常用的函数,可以按组对数据进行处理,apply, lapply, sapply, tapply, mapply,等.这几个函数功能有些类似,下面介绍下这几个函数的用法. Apply 这是对一个Matrix或者Array进行某个维度的运算.其格式是: Apply(数据,维度Index,运算函数,函数的参数) 对于Matrix来说,其维度值为2,第二个参数维度Index中,1表示按行运算,2表示按列运算.下面举一个例子: m<-matrix(1:6,2,3) 构建一个简单的2行3列的矩

R语言中函数调试

有时候会用R语言写一下简单的脚本处理函数,加入需要调试的话可以按照下面的步骤进行: fun <- function(x , y){ x + y x - y x * y x / y } debug(fun) 先创建一个简单的函数,然后用debug() 函数对创建的fun()函数进行debug.这时控制台没有任何变化,但是当再次运行创建函数时会进入debug状态: fun(2 + 3) debugging in: fun(2 + 3) debug at #1: { x + y x - y x * y

R语言常用函数

数据结构 一.数据管理vector:向量 numeric:数值型向量 logical:逻辑型向量 character:字符型向量list:列表 data.frame:数据框 c:连接为向量或列表length:求长度subset:求子集 seq,from:to,sequence:等差序列 rep:重复 NA:缺失值 NULL:空对象 sort,order,unique,rev:排序 unlist:展平列表 attr,attributes:对象属性 mode,typeof:对象存储模式与类型 nam