R 中的 For 循环是邪恶的吗?

2023-11-23

我听说你不打算将过程编程风格强加到 R 上。我发现这很难。我刚刚用 for 循环解决了一个问题。这是错误的吗?有没有更好、更“R 风格”的解决方案?

问题:我有两列:Col1 和 Col2。 Col1 包含以自由格式输入的职位名称。我想使用 Col2 将这些职称收集到类别中(因此“初级技术员”、“工程技术员”和“机械技术员”都列为“技术员”)。

我是这样做的:

jobcategories<-list(
"Junior Technician|Engineering technician|Mech. tech." = "Technician",
"Manager|Senior Manager|Group manager|Pain in the ****" = "Manager",
"Admin|Administrator|Group secretary" = "Administrator")

for (currentjob in names(jobcategories)) {
  df$Col2[grep(currentjob,data$Col1)] <- jobcategories[[currentjob]]
}

这会产生正确的结果,但我无法摆脱这样的感觉:(由于我的程序经验)我没有正确使用 R。 R 专家可以帮助我摆脱痛苦吗?

EDIT

我被要求提供原始数据。不幸的是,我不能提供它,因为里面有机密信息。它基本上是两列。第一列包含 400 多行不同的职位(以及奇怪的个人姓名)。这 400 种图书可分为大约 20 个不同的类别。第二列以 NA 开始,然后在运行 for 循环后填充。


你是对的,在 R 中经常不鼓励使用 for 循环,根据我的经验,这有两个主要原因:

生长物体

正如第 2 圈中雄辩地描述的那样地狱R,一次增长一个对象的一个​​元素可能效率极低,这通常是 for 循环中的诱惑。例如,这是一个非常常见但效率低下的工作流程,因为它重新分配output循环的每次迭代:

output <- c()
for (idx in indices) {
  scalar <- compute.new.scalar(idx)
  output <- c(output, scalar)
}

这种低效率可以通过预分配来消除output到适当的大小并使用 for 循环或使用类似的函数sapply.

错过更快的矢量化替代方案

效率低下的第二个原因是当存在矢量化替代方案时,在快速操作上执行 for 循环。例如,考虑以下代码:

s <- 0
for (elt in x) {
  s <- s + elt
}

这是一个非常快速的操作(将两个数字相加)的 for 循环,与向量化相比,循环的开销将很大sum函数,将向量中的所有元素相加。这sum函数速度很快,因为它是用 C 实现的,所以执行起来会更有效率s <- sum(x)比使用 for 循环(更不用说更少的打字)。有时需要更多的创造力来弄清楚如何用矢量化替代方案替换 for 循环(cumsum and diff出现很多),但它可以显着提高效率。如果您有一个快速循环内部,但无法弄清楚如何使用矢量化函数来实现相同的目标,我发现使用 Rcpp 包重新实现循环可以产生更快的替代方案。

总之...

如果您错误地增长对象,或者循环内部非常快,并且整个循环可以用矢量化操作替换,则 For 循环可能会很慢。否则,您可能不会损失太多效率,因为 apply 函数系列也在内部执行 for 循环。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R 中的 For 循环是邪恶的吗? 的相关文章

随机推荐

  • 为什么非正规浮点值处理起来较慢?

    通常情况下 消耗或产生非正规值的浮点值比其他情况慢 有时慢得多 为什么会这样呢 如果是因为它们被软件捕获而不是直接在硬件中处理 据说在某些 CPU 上就是如此 那么为什么它们必须这样做呢 对于 IEEE 754 浮点 遇到的大多数操作数都是
  • 使用 weave 作为网络在 kubernetes 内运行的 docker 容器内没有互联网连接

    我有一个在 AWS EC2 实例上运行的 kubernetes 集群 并编织为网络 cni 我已经禁用了 docker 网络 ipmask 和 iptables 因为它是由 weave 管理的 以避免网络冲突 我已经在这个集群上部署了 Je
  • TortoiseGit 克隆选项在右键单击上下文菜单中不可用

    我已在 Windows 7 64 位计算机上安装了 Git 2 5 2 64 位和 TortoiseGit 1 8 16 0 64 位 我想克隆存储库 但是当我在 Windows 资源管理器中右键单击时 我没有看到克隆存储库的选项 我已经转
  • php 中的 cURL 选项 - 什么选项是 -u [关闭]

    Closed 这个问题是无关 目前不接受答案 我的参考文献列出了一个选项 curl u ExactID Password 这是否意味着我只需使用 CURLOPT USERPWD 并使用 ExactID Password 格式 是的 CLI
  • 如何设置 django 和 mysql 使用 UTF-8

    我想将 Django mysql 站点设置为使用 UTF 8 请指导我必须在 django 和 mysql 中进行的更改 以确保以下事项 用户在表单中输入的数据将始终编码为 UTF 8 将数据以utf 8存储在mysql中 正确显示模板中的
  • 确定某个值是否在 TensorFlow 中的集合中

    The tf logical or tf logical and and tf select功能非常有用 但是 假设你有价值x 并且您想看看它是否在set a b c d e 在 python 中你只需写 if x in set a b c
  • 在没有root访问权限的情况下安装python包[重复]

    这个问题在这里已经有答案了 我想在我使用的服务器中安装python包networkx 在问这个问题之前我进行了搜索 它说使用 pip install user networkx 但它不起作用 linux错误是 Usage usr bin p
  • 在android中缩放和平移位图

    我正在尝试出售位图并在每一步进行翻译 如果我们看下面的代码 我正在绘制一个图像 对其进行平移和缩放 然后反向执行相同的操作 以便恢复原始配置 但在应用操作后 我确实得到了原始缩放图像 比例因子 1 但图像被平移到不同的位置 您能指出正确的方
  • 根据文本调整 UILabel 高度

    考虑我有以下文本UILabel 一长行动态文本 由于外星军队的数量远远超过团队 玩家必须利用后世界末日的世界来发挥自己的优势 例如在垃圾箱 柱子 汽车 瓦砾和其他物体后面寻找掩护 我想调整大小UILabel s高度 以便文本可以适合 我正在
  • 在 iOS 7 中使用相机时,应用程序因内存压力而终止

    我面临错误应用程序因内存压力而终止当我使用 UIImagePickerController Camera 捕获一些图像时 我首先收到内存警告 然后应用程序突然崩溃 这个问题在 iOS 7 中特别明显 在 iOS 6 中它工作得很好 有人知道
  • Jenkins 管道条件环境变量

    我有一组静态环境变量environmental声明性管道的指令部分 这些值可用于管道中的每个阶段 我希望这些值根据任意条件而改变 有没有办法做到这一点 pipeline agent any environment if params con
  • jQuery:如何在页面加载时滚动到某个锚点/div?

    最近我尝试更频繁地使用 jquery 现在我遇到一些问题 我想用 jquery 解决 希望你能帮助我 我有一些包含一些锚标记的网页 假设锚位于页面中间 并且在事件加载时我希望页面在某个锚标记位置启动 这意味着页面将自动 滚动 到某个位置 这
  • 如何处理 System.Data.DataTableExtensions.CopyToDataTable() 中的缺陷

    我遇到了一些可能是扩展方法中的缺陷的事情 CopyToDataTable 此方法用于导入 在 VB NET 中 System Data DataTableExtensions然后针对 IEnumerable 调用该方法 如果您想使用 LIN
  • 无法加载 /usr/local/lib 中存在的共享库 (Fedora x64)

    当尝试运行我刚刚成功编译的程序时 出现以下错误 src sensors laser scan Producer 加载共享库时出错 liblcm so 1 无法打开共享对象文件 没有这样的文件或目录 ls usr local lib libl
  • Javascript - 标准化带重音的希腊字符

    我正在尝试对希腊文本应用某种标准化 使用小写字母 删除重音符号并将 替换为 例如 我希望 希腊语多调 和 现代希腊语 变成 我跑过unicode table com并写下我应该替换哪些角色 Greek and Coptic Range 03
  • 无法将 spring-modules-validation 与 spring 3 一起使用

    我有以下 pom 文件
  • Git 扩展和 Meld 合并

    使用时是否可以使用Meld作为合并工具Git 扩展在 Windows 上 在 Git 扩展中 设置 gt Git 配置 Merge tool meld Path to mergetool C Program Files x86 Meld M
  • 还有比 pandas fillna() 更快的方法吗?

    Pandas fillna 速度非常慢 尤其是在数据框中存在大量丢失数据的情况下 还有比它更快的方法吗 我知道如果我简单地删除一些包含 NA 的行和 或列会有帮助 我尝试测试 np random seed 123 N 60000 df pd
  • 如何将投影应用于 Spring Data REST 查询方法资源?

    我正在使用 Spring Data REST 2 1 4 RELEASE 我创建 一个实体Booking 它的 REST 存储库 扩展CrudRepository named BookingRepository and a 投影 Booki
  • R 中的 For 循环是邪恶的吗?

    我听说你不打算将过程编程风格强加到 R 上 我发现这很难 我刚刚用 for 循环解决了一个问题 这是错误的吗 有没有更好 更 R 风格 的解决方案 问题 我有两列 Col1 和 Col2 Col1 包含以自由格式输入的职位名称 我想使用 C