目录:
视频: 在R中讀取Excel資料表 2024
向量化是R语言的定义属性之一。如果没有某种if … else语句的矢量化版本,R就不会是R.
问题
priceCalculator()函数的使用仍然不是很经济。如果你有100个客户,你必须分别计算每个客户的价格。检查你自己,如果你添加了三个不同的小时数作为参数会发生什么情况:
<! - 1 - >priceCalculator(c(25,110))[1] 1060 4664警告消息:如果(小时> 100)净。价格1,只有第一个元素将被使用
R不仅警告你可疑的事情正在进行,但你得到的结果是明显错误的。而不是$ 4,664,第二个客户端应该只收取$ 4,198: >> priceCalculator(110)[1] 4198
警告消息应该给你一个公平的想法。 if语句只能处理单个值,但表达式hours> 100会返回两个值,如下面的代码所示:
根据R
中的逻辑向量进行选择您正在寻找的解决方案是ifelse ,这是从两个向量中选择值的向量化方式。这个显着的函数有三个参数:
具有逻辑值
-
的测试向量如果测试向量中的相应值为TRUE,则应返回值的向量
-
-
工作原理
查看下面的示例:
ifelse c(1,3)<2.5,1:2,3:4)[1] 1 4
运行函数所执行的步骤:
条件表达式c(1,3)<2。 5被评估为逻辑向量。
-
这个向量的第一个值是TRUE,因为1小于2.所以,结果的第一个值是第二个参数的第一个值,它是1.
-
下一个值是FALSE ,因为3大于2. 5.因此,ifelse()将第三个参数(即4)的第二个值作为结果的第二个值。
-
作为结果返回具有所选值的向量。
-
试一试
要在priceCalculator()函数的例子中看看它是如何工作的,可以在控制台的命令行中试试这个函数。假设你有两个客户,你分别为他们工作了25个小时和110个小时。您可以使用以下代码计算净价格: >> my。小时我的。小时* 40 * ifelse(我的。小时> 100,0.9,1)[1] 1000 3960
记住,ifelse()函数可以回收它的参数。而这正是它在这里所做的。在前面的ifelse()函数调用中,翻译由表达式my创建的逻辑向量。小时> 100分别代入TRUE和FALSE代入数字0. 9和1的向量。
修改R
中的函数当然,您需要修改priceCalculator()函数,以便您还可以输入一个带有参数public值的向量。否则,您将无法计算公共和私人客户的混合价格。最终的功能如下所示:
priceCalculator < - function(hours,pph = 40,public){net。价格< - 小时* pph净值。价格100,0.9,1)tot。价格< - 净值。价格* ifelse(public,1. 06,1. 12)round(price)}
接下来,创建一个小数据框来测试函数。例如: >>客户端< - 数据。 (+小时= c(25,110,125,40),+ public = c(TRUE,TRUE,FALSE,FALSE)+)
现在可以使用这个数据框作为priceCalculator像这样:
with(clients,priceCalculator(hours,public = public))[1] 1060 4198 5040 1792