如何在 r 中编写函数来对记录进行计算?

2023-11-30

在 C# 中,我习惯了数据集和当前记录的概念。 对我来说,根据当前记录的条件编写一个复杂的计算价格函数是很容易的。

我无法理解如何在 r 中执行此操作。

我尝试了以下方法

   train <- read.csv("Train.csv" )
   df <- as.data.frame.matrix(train)
   v = c(  df$Fuel.Type ,df$No.Gears)
   names(v ) <- c( "FuelType" ,"NoGears")
   df$FEType = FEType( v)

其中 my 函数定义为

FEType <- function(v    ){
  ret="Low"
  if (v["FuelType"]=='G') {
    ret ="High"
  }
  return(ret)
}

这没有按我的预期工作 当我检查 v 时,我发现它包含总计而不是我预期的当前行。

我哪里错了?

在问题中here我在最后一段中看到了一些提示。

为了重现问题,表明我想要做什么,我有

IsPretty <-function(PetalWidth){
  if (PetalWidth  >0.3) return("Y")
  return("N")
}

df <- iris
df$Pretty = IsPretty(df$Petal.Width)
    

这给出了错误

条件长度 > 1 并且仅使用第一个元素

这促使我研究向量。但我不相信这是正确的方向。

[Update]

我习惯于思考表格和当前记录。 因此我想

df$Pretty = IsPretty(df$Petal.Width)

会产生使用计算出的 isPretty 属性向我的数据框添加一列的效果

为什么我的计算中不能包含 if 条件?


矢量化是您需要在 R 中习惯的最基本(也是不寻常)的事情之一。许多(大多数?)R 操作都是矢量化的。但有些事情并非如此——而且if(){}else{}是非矢量化的事物之一。它用于控制流(无论是否运行代码块),而不用于向量运算。ifelse()是一个用于向量的单独函数,其中第一个参数是“测试”,第二个和第三个参数是“如果是”和“如果否”结果。测试是一个向量,返回的值是测试中每个项目的适当的是/否结果。结果将与测试的长度相同.

所以我们会写你的IsPretty像这样的函数:

IsPretty <- function(PetalWidth){
  return(ifelse(PetalWidth > 0.3, "Y", "N"))
}

df <- iris
df$Pretty = IsPretty(df$Petal.Width)

对比一个if(){...}else{...}测试条件长度为 1 的块,并且可以在其中运行任意代码...- 可能返回比测试更大的结果,或者更小的结果,或者没有结果 - 可能会修改其他对象...你可以在里面做任何事情if(){}else(),但测试条件的长度必须为 1。

你可以用你的IsPretty一次运行一行 - 它对于任何一行都可以正常工作。所以我们可以将它放入一个循环中,如下所示,一次检查一行,给出if()一次进行一项测试,一次分配一个结果。但是 R 针对矢量化进行了优化,这会明显变慢,并且是一个坏习惯。

IsPrettyIf <-function(PetalWidth){
  if (PetalWidth  >0.3) return("Y")
  return("N")
}

for(i in 1:nrow(df)) {
  df$PrettyLoop[i] = IsPrettyIf(df$Petal.Width[i])
}

下面的基准测试显示矢量化版本的速度提高了 50 倍。这是一个如此简单的案例和如此小的数据,因此并不重要,但对于更大的数据,或更复杂的操作,矢量化和非矢量化代码之间的差异可能是几分钟与几天。

microbenchmark::microbenchmark(
  loop = {
    for(i in 1:nrow(df)) {
      df$PrettyLoop[i] = IsPrettyIf(df$Petal.Width[i])
    }
  },
  vectorized = {
    df$Pretty = IsPretty(df$Petal.Width)    
  }
)
Unit: microseconds
       expr    min     lq     mean median      uq     max neval
       loop 3898.9 4365.6 5880.623 5442.3 7041.10 11344.6   100
 vectorized   47.7   59.6  112.288   67.4   83.85  1819.4   100

对于 R 学习者来说,这是一个常见的问题 - 您可以在 Stack Overflow 上找到人们使用的许多问题if(){}else{}当他们需要时ifelse()或相反亦然。为什么不能ifelse返回向量?是来自问题另一面的常见问题解答。


你的尝试发生了什么?

df <- iris

## The condition has length equal to the number of rows in the data frame
df$Petal.Width > 0.3
#>   [1] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
#>  [13] FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE
## ... truncated


## R warns us that only the first value (which happens to be FALSE) is used
result = if(df$Petal.Width > 0.3) {"Y"} else {"N"}
#> Warning in if (df$Petal.Width > 0.3) {: the condition has length > 1 and only
#> the first element will be used

## So the result is a single "N"
result  
#> [1] "N"

length(result)
#> [1] 1


## R "recycles" inputs that are of insufficient length
## so we get a full column of "N"
df$Pretty = result
head(df)
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width Species Pretty
#> 1          5.1         3.5          1.4         0.2  setosa      N
#> 2          4.9         3.0          1.4         0.2  setosa      N
#> 3          4.7         3.2          1.3         0.2  setosa      N
#> 4          4.6         3.1          1.5         0.2  setosa      N
#> 5          5.0         3.6          1.4         0.2  setosa      N
#> 6          5.4         3.9          1.7         0.4  setosa      N

Created on 2020-11-08 by the reprex package (v0.3.0)

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

如何在 r 中编写函数来对记录进行计算? 的相关文章

随机推荐

  • 比“尝试”和“例外”更快的方法? - Python

    我经常将代码写成如下 try self title item title content string except AttributeError e self title None 有没有更快的方法来处理这个问题 一行 您遇到了哪些例外情
  • 在jspdf中添加自定义字体

    我想在 jsPDF 中使用自定义字体 例如 Comic Sans MS 或 Calibri 字体 我发现了类似的问题here 但我的不工作 我已经添加了最新的jspdf 我的代码如下 var doc new jsPDF p mm a4 do
  • swt表改变选择项颜色

    我正在使用一个标准的 swt 表 您可能知道 默认情况下 选择一个项目时颜色为蓝色 Windows 标准 当选择处于非活动状态时 它会变成浅灰色 我想覆盖这两种颜色 我在整个网络上进行了搜索 但只能找到一些非常旧的代码 这些代码似乎不再适用
  • PrototypeJS:如何选择动态创建的元素?

    该网站使用 Prototype JS 库 页面加载后 它立即执行 Ajax 请求 该请求会拉出并显示页面的更多元素 我需要能够选择那些动态创建的元素并将它们隐藏 hide method 我尝试使用选择并隐藏它们document observ
  • 从 XML 反序列化为列表对象

    我正在执行将 XML 文件转换为列表对象的程序 我已成功完成从 List 到 XML 的序列化 但是在进行反序列化时遇到问题 请任何人告诉我我在这段代码中做错了什么 这是我的 XML 代码
  • 设计可以标记多个数据库表的标记系统

    我希望允许用户标记项目 以便他们可以使用标签搜索它们 干净地实现这一目标的最佳方法是什么 到目前为止 我提出的解决方案仅涉及向我当前的数据库系统添加两个额外的表
  • 绘制 SEM 模型中与 R 中观察到的变量的交互效应

    我正在估计一个已观察到变量的 SEM 模型 我正在使用 SEM 来使用 FIML 处理缺失数据 我的模型有一个交互项来测试适度性 这是一个说明问题的玩具示例 library lavaan library car library dplyr
  • Cakephp生成xml错误-空格

    我正在尝试在 CakePHP 中生成动态 xml 文档以输出到浏览器 这是我的控制器代码 Configure write debug 0 this gt layout null header Content type text xml ec
  • 使用 itextpdf 时,横向和纵向 PDF 的页面大小始终相同

    我有一个 PDFReader 其中包含一些横向模式的页面和其他纵向模式的页面 我需要区分它们以进行一些处理 但是 如果我调用 getOrientation 或 getPageSize 则该值始终相同 页面大小为 595 方向为 0 为什么横
  • CSS 中的装饰艺术风格边框

    我希望使用纯 CSS 来实现这种边框效果 我的偏好是在不添加额外的 div 元素的情况下实现它 任何建议 将不胜感激 编辑 固定图像描述 你可以像下面这样做 box width 150px height 200px border 15px
  • Android:从网页获取 HTML 作为字符串,HttpClient 不起作用

    我正在编写一个使用 HttpClient 连接到网页的应用程序 目的是能够将网页的一些 HTML 复制到字符串中 我尝试使用 HttpClient 连接来完成此任务 这是我使用的代码 public void getText final Te
  • 在不同 DPI 下使用 GetWindowRect 的坐标误差

    我想捕获 MFC 程序中组件的坐标 现在我可以通过使用完美地完成这个GetWindowRect 但是 当我将 Windows dpi 设置为 150 120 dpi 时 我得到的坐标不同GetWindowRect 因此 我研究了一些将新坐标
  • Ruby OpenSSL 嵌套 asn1 错误

    我已经尝试过针对此处发布的几个问题的建议 但无济于事 我有以下文件 注意 我即时生成了这些文件 它们是一次性密钥 证书文件 BEGIN CERTIFICATE MIIE jCCA KgAwIBAgIJAMLMeL HH75vMA0GCSqG
  • 将 smarty 数组转换为 javascript 数组

    我有一个聪明的数组 promoFormData Smarty Variable Object 3 gt value Array 1 deliveryDates gt Array 3 0 gt Array 2 startDate gt 201
  • 画布 toDataUrl 的跨源访问失败

    我想创建一个小页面 人们可以在其中创建万花筒 我使用可用的脚本并添加了一些图像浏览和保存功能 现在 我在将生成的画布数据保存为图像时遇到了一个奇怪的问题 火狐控制台说 SecurityError 操作不安全 调用失败 Canvas2Imag
  • 在服务类中显示 ProgressDialog

    我正在使用服务通过 AsyncTask 连接到网络 我想显示一个 ProgressDialog 直到应用程序连接到网络 但我该怎么做呢 我的服务如下所示 package de bertrandt bertrandtknx import tu
  • Paypal 表单破坏了我的 ASP.NET webforms 布局 -> 如何解决?

    I am a student who is doing up a simple website in asp net My problem is I wish to integrate Paypal on one of the pages
  • 用于密码验证的正则表达式 Java

    我正在创建一个用于密码验证的正则表达式 以在 Java 应用程序中用作配置参数 正则表达式是 8 0 9 a z A Z 密码策略是 至少 8 个字符 至少包含一位数字 至少包含 1 个下位字母字符和 1 个上位字母字符 一组特殊字符中至少
  • SQL 查找最受欢迎的类别

    我的数据库 MySQL 中有 3 个表 categories name string items name string category id int votes value int item id int created at date
  • 如何在 r 中编写函数来对记录进行计算?

    在 C 中 我习惯了数据集和当前记录的概念 对我来说 根据当前记录的条件编写一个复杂的计算价格函数是很容易的 我无法理解如何在 r 中执行此操作 我尝试了以下方法 train lt read csv Train csv df lt as d