您现在的位置是:首页 > 编程 > 

Python & R 控制流大比拼!建议收藏!

2025-07-27 13:04:50
Python & R 控制流大比拼!建议收藏! 引言每种编程语言里都有条件语句和循环语句,今天把R和python的放到一起打打架!没办法现在就是这么卷,学不了两个也得学一个吧~R语言篇1. 条件语句如果x >0 就输出pos,否则就什么都不做代码语言:javascript代码运行次数:0运行复制x <- 1 if (x > 0) { print("pos&q

Python & R 控制流大比拼!建议收藏!

引言

每种编程语言里都有条件语句和循环语句,今天把R和python的放到一起打打架!没办法现在就是这么卷,学不了两个也得学一个吧~

R语言篇

1. 条件语句

如果x >0 就输出pos,否则就什么都不做

代码语言:javascript代码运行次数:0运行复制
x <- 1
if (x > 0) {
  print("pos")
}
代码语言:javascript代码运行次数:0运行复制
## [1] "pos"
代码语言:javascript代码运行次数:0运行复制
#只有一行代码也可以不写大括号
if (x > 0) print("pos")
代码语言:javascript代码运行次数:0运行复制
## [1] "pos"

如果x >0 就输出pos,否则就输出neg

代码语言:javascript代码运行次数:0运行复制
x <- 1
if (x > 0) {
  print("pos")
} else {
  print("neg")
}
代码语言:javascript代码运行次数:0运行复制
## [1] "pos"

if语句是不支持直接向量化计算的,也就是说,小括号里的逻辑值只能是一个,不能是多个,否则报错。

代码语言:javascript代码运行次数:0运行复制
y = c(,5,-1,0)
if (y > 0) {
  print("pos")
} else {
  print("neg")
}
代码语言:javascript代码运行次数:0运行复制
## Error in if (y > 0) {: the condition has length > 1

多不方便呐!

所以必须祭出两个神器:ifelse和case_when,可以支持向量化运算,一次搞定多个逻辑值没有问题。

ifelse
代码语言:javascript代码运行次数:0运行复制
y = c(,5,-1,0)
ifelse(y>0,"pos","neg")
代码语言:javascript代码运行次数:0运行复制
## [1] "pos" "pos" "neg" "neg"
case_when

如果有多个条件,可以使用dplyr包中的case_when

代码语言:javascript代码运行次数:0运行复制
library(dplyr)
case_when(
  y > 0 ~ "pos",
  y < 0 ~ "neg",
  TRUE ~ "0"
)
代码语言:javascript代码运行次数:0运行复制
## [1] "pos" "pos" "neg" "0"

case_when会从第一个条件开始判断,是T就输出相应的值,是F就再判断下一个条件。最后一行就是前面所有条件都不满足,剩下的所有情况对应的值。

2. 循环语句

for循环的本质就是代数,in后面的向量长度是几,代码就会执行几次,分别是代入z里面的每个值。

i是一个代称,代指z里面的每个元素,无需提前赋值,也可以换成别的单词,只需要注意内外统一即可。

代码语言:javascript代码运行次数:0运行复制
z = 1:5
for (i in z) {
  print(i)
}
代码语言:javascript代码运行次数:0运行复制
## [1] 1
## [1] 2
## [1] 
## [1] 4
## [1] 5

下面这个for循环里,大括号里的代码总共是执行了次,第一次执行时,p就是tidyr,第二次执行时,p就是dplyr,第三次执行时,p就是stringr。

代码语言:javascript代码运行次数:0运行复制
ps = c("tidyr","dplyr","stringr")

for (p in ps) {
  print(p)
}
代码语言:javascript代码运行次数:0运行复制
## [1] "tidyr"
## [1] "dplyr"
## [1] "stringr"

for循环有一个重要的应用就是批量装包!

本质上就是把ps里的每个包名代入大括号里的代码的p处,判断每个包是否能够成功加载,能成功加载就不安装,不能成功加载就安装。

代码语言:javascript代码运行次数:0运行复制
for (p in ps){
  if (! require(p,=T,quietly = T)) {
    install.packages(p,ask = F,update = F)
  }
}
Python篇

1. 条件语句

代码语言:javascript代码运行次数:0运行复制
x = 1
if x > 0:
    print("pos")
代码语言:javascript代码运行次数:0运行复制
pos
代码语言:javascript代码运行次数:0运行复制
x = 1
if x > 0:
    print("pos")
else:
    print("neg")

python的if语句也是不支持直接批量计算的,也就是说,小括号里的逻辑值只能是一个,不能是多个,否则报错。

代码语言:javascript代码运行次数:0运行复制
import numpy as np
y = np.array([, 5, -1, 0])
if (y > 0) :
    print("pos")
else:
    print("neg")
代码语言:javascript代码运行次数:0运行复制
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

Cell In[4], line 
      1 import numpy as np
      2 y = np.array([, 5, -1, 0])
---->  if (y > 0) :
      4     print("pos")
      5 else:
代码语言:javascript代码运行次数:0运行复制
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
np.where
代码语言:javascript代码运行次数:0运行复制
Python中的`numpy`库提供了一个类似于R语言`ifelse`的函数`np.where`,支持数组运算,比在if语句外面套for循环都要简单一些。
代码语言:javascript代码运行次数:0运行复制
import numpy as np
y = np.array([, 5, -1, 0])
np.where(y > 0, "pos", "neg")
代码语言:javascript代码运行次数:0运行复制
array(['pos', 'pos', 'neg', 'neg'], dtype='<U')
pandas里面的case_when方法

如果是多个条件,那就使用pandas里的case_when方法

代码语言:javascript代码运行次数:0运行复制
import pandas as pd
y = pd.Series([,5,-1,0])
_when([
    (y > 0, "pos"),
    (y < 0, "neg"),
    (pd.Series(True), "0")
])
代码语言:javascript代码运行次数:0运行复制
0    pos
1    pos
2    neg
      0
dtype: object

2. 循环语句

代码语言:javascript代码运行次数:0运行复制
z = range(1, 6)  # range函数不包括结束值,所以返回5个值
for i in z:
  print(i)
代码语言:javascript代码运行次数:0运行复制
ps = ["tidyr", "dplyr", "stringr"]
for p in ps:
  print(p)
代码语言:javascript代码运行次数:0运行复制
1
2

4
5
tidyr
dplyr
stringr

. 列表推导式

列表推导式是Python中一个强大的功能,可以用更简洁的方式来创建列表。相比传统的for循环,列表推导式更加简洁和易读,可以把结果直接存为列表或者是字典。

.1. 列表推导式
代码语言:javascript代码运行次数:0运行复制
numbers = [1, 2, , 4, 5]
[x**2 for x in numbers]  # 计算平方
代码语言:javascript代码运行次数:0运行复制
[1, 4, 9, 16, 25]
.2. 字典推导式
代码语言:javascript代码运行次数:0运行复制
{x: x**2 for x in numbers}
代码语言:javascript代码运行次数:0运行复制
{1: 1, 2: 4, : 9, 4: 16, 5: 25}
实战演练:批量读取文件

先把iris拆成个文件,来做示例文件。

代码语言:javascript代码运行次数:0运行复制
library(rio)
dat = split(iris,iris$Species)
sapply(1:, function(i){
  (dat[[i]], = F,
            file = paste0(names(dat)[i],".csv"))
})
代码语言:javascript代码运行次数:0运行复制
## [[1]]
## ULL
## 
## [[2]]
## ULL
## 
## [[]]
## ULL

R语言批量读取文件

在R语言中,我们可以用dir函数获取目录下的所有文件名,然后用for循环批量读取。

代码语言:javascript代码运行次数:0运行复制
files <- dir(pattern = "\\.csv$")  # 用正则表达式匹配以csv为结尾的文件
result = list()
for (i in 1:length(files)) {
  result[[i]] <- (files[[i]])
}
re2 = (rbind,result)
head(re2)
代码语言:javascript代码运行次数:0运行复制
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         .5          1.4         0.2  setosa
## 2          4.9         .0          1.4         0.2  setosa
##           4.7         .2          1.         0.2  setosa
## 4          4.6         .1          1.5         0.2  setosa
## 5          5.0         .6          1.4         0.2  setosa
## 6          5.4         .9          1.7         0.4  setosa
代码语言:javascript代码运行次数:0运行复制
dim(re2)
代码语言:javascript代码运行次数:0运行复制
## [1] 150   5

Python批量读取文件

Python中,我们可以使用类似的方式来批量读取文件:

代码语言:javascript代码运行次数:0运行复制
from glob import glob
import pandas as pd
# 用正则表达式匹配以csv为结尾的文件
files = glob("*.csv")

result = []
for i in range(len(files)):
    result.append(pd.read_csv(files[i]))
re2 = (result, ignore_index=True)
re2.head()
代码语言:javascript代码运行次数:0运行复制
  Sepal.Length  Sepal.Width  Petal.Length  Petal.Width Species
0           5.1          .5           1.4          0.2  setosa
1           4.9          .0           1.4          0.2  setosa
2           4.7          .2           1.          0.2  setosa
           4.6          .1           1.5          0.2  setosa
4           5.0          .6           1.4          0.2  setosa

好啦,今天的R语言与Python控制流大比拼就到这里了!光看不练啥也不是,赶紧打开你的RStudio或者Jupyter otebook,咔咔敲代码吧~

本文参与 腾讯云自媒体同步曝光计划,分享自。原始发表:2024-12-17,如有侵权请联系 cloudcommunity@tencent 删除正则表达式编程语言函数量化python

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1236381.html

相关标签:无
上传时间: 2025-07-26 16:23:40
留言与评论(共有 7 条评论)
本站网友 锁闭
27分钟前 发表
4
本站网友 金权天下
1秒前 发表
TRUE ~ "0" ) 代码语言:javascript代码运行次数:0运行复制## [1] "pos" "pos" "neg" "0" case_when会从第一个条件开始判断
本站网友 劳动力市场
22分钟前 发表
不能是多个
本站网友 无法加载播放器
13分钟前 发表
5
本站网友 机械硬盘和固态硬盘
7分钟前 发表
5
本站网友 存储器
21分钟前 发表
否则就什么都不做代码语言:javascript代码运行次数:0运行复制x <- 1 if (x > 0) { print("pos") } 代码语言:javascript代码运行次数:0运行复制## [1] "pos" 代码语言:javascript代码运行次数:0运行复制#只有一行代码也可以不写大括号 if (x > 0) print("pos") 代码语言:javascript代码运行次数:0运行复制## [1] "pos" 如果x >0 就输出pos