R 在使用 case_when 时提供参数(R 向量化)

2024-01-07

这是我之前提出的问题的后续问题(当存在大量类别/类型时,R 使用 case_when (R 向量化)应用多个函数 https://stackoverflow.com/questions/62377561/r-apply-multiple-functions-when-large-number-of-categories-types-are-present-usi)。不幸的是我一直没能找出问题所在。我想我可能已经缩小了问题的根源,并想检查是否有比我更了解的人可以帮助我找出解决方案。

假设我有以下数据集:

set.seed(100)
City=c("City1","City2","City2","City1")
Business=c("B","A","A","B")
ExpectedRevenue=c(35,20,15,19)
zz=data.frame(City,Business,ExpectedRevenue)

这里假设存在 2 个不同的企业,名为“A”和“B”。进一步假设存在两个不同的城市City1和City2。我的原始数据集包含多个企业和约 100 个城市的约 20 万个观察结果。对于每个城市,我都有一个独特的预先编写的函数来计算调整后的收入。我不想按每个观察/行运行它们,而是想使用 case_when 来运行相关城市的函数(例如,获取城市 1 的观察结果,如果可能的话,为城市 1 运行矢量化函数,然后移动到城市 2 等等)。

为了便于说明,假设我对这两个城市有以下高度简化的函数。

#Writing the custom functions for the categories here
City1=function(full_data,observation){
  NewSet=full_data[which(full_data$City==observation$City),]
  BusinessMax = max(NewSet$ExpectedRevenue)+10*rnorm(1)
  return(BusinessMax)
}

City2=function(full_data,observation){
  NewSet=full_data[which(full_data$City==observation$City),]
  BusinessMax = max(NewSet$ExpectedRevenue)-1000*rnorm(1)
  return(BusinessMax)
}

这些简单的函数本质上是对城市数据进行子集化,并添加 (City1) 或减去 (City2) 一些数据随机数从预期收入来看。再次强调,这些简单的功能仅用于说明,并不反映实际功能。我还通过输入以下内容手动检查这些功能是否有效:

City1(full_data = zz,observation = zz[1,])
City1(full_data = zz,observation = zz[4,]) 

并得到“29.97808”和“36.31531”。请注意,在上述函数中,由于我添加或减去一个随机数,因此我希望在同一城市的两个观测值中获得不同的值,就像我在这里获得的那样。

最后,我尝试使用 case_when 来运行代码,如下所示:

library(dplyr) #I use dplyr here
zz[,"AdjustedRevenue"] = case_when(
  zz[["City"]]=="City1"~City1(full_data=zz,observation=zz[,]),
  zz[["City"]]=="City2"~City2(full_data=zz,observation=zz[,])
)

我收到的输出如下:

   City Business ExpectedRevenue AdjustedRevenue
1 City1        B              35        43.86785
2 City2        A              20       -81.97127
3 City2        A              15       -81.97127
4 City1        B              19        43.86785

Here, 对于观测值 1 和 4 & 2 和 3,调整后的值相同。相反,我期望为每个观察获得不同的值(因为我为每个观察添加或删除一些随机数;或者至少有意这样做)。根据马丁·加尔对我之前问题的回答(https://stackoverflow.com/a/62378991/3988575 https://stackoverflow.com/a/62378991/3988575),我怀疑这是由于在最后一步中没有正确调用我的 City1 和 City2 函数的第二个参数。然而,我在试图找出原因以及如何解决它时有些迷失。

如果有人能指出为什么会发生这种情况以及如何修复此错误,那将非常有帮助。提前致谢!

附: 我也对其他矢量化解决方案持开放态度。我对矢量化比较陌生,没有太多经验,希望得到任何建议。


转换了City功能dplyr. If CityMaster对于最终的函数来说太简化了mer可以移动到里面case_when如适用。如果将新城市添加到数据中,则会返回NA直到定义一个案例。

library(dplyr)
CityMaster <- function(data, city) {
  mer <- data %>%
    filter(City == city) %>%
    pull(ExpectedRevenue) %>%
    max()
  case_when(city == 'City1' ~ mer + 10 * rnorm(1),
            city == 'City2' ~ mer - 1000 * rnorm(1),
            TRUE ~ NA_real_)
}

set.seed(100)
zz %>%
  rowwise() %>%
  mutate(AdjustedRevenue = CityMaster(., City))

# A tibble: 4 x 4
# Rowwise: 
  City  Business ExpectedRevenue AdjustedRevenue
  <chr> <chr>              <dbl>           <dbl>
1 City1 B                     35            30.0
2 City2 A                     20          -867. 
3 City2 A                     15          -299. 
4 City1 B                     19            29.2

打破城市功能

City1 <- function(data, city) {
  data %>%
    filter(City == city) %>%
    pull(ExpectedRevenue) %>%
    max() + 10 * rnorm(1)
}

City2 <- function(data, city) {
  data %>%
    filter(City == city) %>%
    pull(ExpectedRevenue) %>%
    max() - 1000 * rnorm(1)
}

set.seed(100)
zz %>%
  rowwise() %>%
  mutate(AdjustRevenue = case_when(City == 'City1' ~ City1(., City),
                                   City == 'City2' ~ City2(., City),
                                   TRUE ~ NA_real_))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R 在使用 case_when 时提供参数(R 向量化) 的相关文章

  • 如何根据一个值过滤远程表?

    我正在做一个filter using in 但 dplyr 翻译查询的方式似乎不正确 事实上 in 运算符对于多个值可以正常工作 但当仅存在单个元素时则不行 在我最初的场景中 过滤值是动态的 因此我希望有一个在这两种情况下都有效的函数 my
  • 如何找到连续数字的区间开始和结束的位置?

    我有一个向量 vec lt c 2 3 5 6 7 8 16 19 22 23 24 连续的数字是 c 2 3 c 5 6 7 8 c 22 23 24 所以第一个向量从 2 开始 到 3 结束 第二个向量从 5 开始 到 8 结束 对于第
  • Databricks:如何从 R Dataframe 切换到 Pandas Dataframe(同一笔记本中的 R 到 python)

    我正在 Databricks 笔记本中编写 R 代码 该代码在 R 中执行多项操作 清理数据帧后 我想使用 python 在 python 单元中调用它 因此使用 python 代码继续对数据帧进行操作 因此 我想在 python 块内将我
  • Shiny中的DT:仅更改单行的颜色

    我有一个数据集 ID Value 102 306 41 800 101 783 105 193 myID 334 我想将其绘制为数据表 其中只有带有 myID 的行为橙色 表的其余部分为蓝色 看过之后辅助函数 https rstudio g
  • 替换 gtable 中 ggplot 的元素:标签和网格线

    我正在学习操纵ggplot对象与gtable 这是我问的一个相关问题 用 grid 和 gtable 拆解 ggplot https stackoverflow com questions 27750737 dismantling a gg
  • merge.zoo 删除时区

    的结果merge zoo与其输入的时区不同 考虑下面的例子 library zoo zoo a zoo data frame a 1 5 seq as POSIXct 2014 01 01 00 00 01 tz UTC as POSIXc
  • 使用 rpy2 将 NULL 从 Python 转换为 R

    在 R 中经常NULL值用作默认值 使用 Python 和 RPy2 如何显式提供NULL争论 None不可兑换 NotImplementedError 字符串 NULL 只会被转换为字符串 并在执行过程中导致错误 采取以下示例 使用tsi
  • R data.table 按组创建列表列

    我有一个data table下面 我想将一个函数应用于列v2通过 分组v1 and order 结果列v3应该是下面的向量列表 如何编写这个函数 以便它为每个组的第一行返回一个 0 向量 order 1 v1 in c 1 2 对于组中的每
  • 如何在data.table中使用OR条件连接表

    在 data table 中是否可以使用 OR 条件连接表 例如 library data table X lt data table x c a b c d e f y c 1 1 2 2 3 3 z c 10 11 12 13 14 1
  • 使用条件函数在 data.table() 中分配多列

    在上一个问题中在 dplyr mutate 中返回一个列表 https stackoverflow com questions 21630406 return a list in dplyr mutate noredirect 1 comm
  • 如何使用 2 个不同的 y 轴进行绘图?

    我想在 R 中叠加两个散点图 以便每组点都有自己的 不同的 y 轴 即在图上的位置 2 和 4 中 但这些点看起来叠加在同一个图上 是否可以这样做plot Edit显示问题的示例代码 example code for SO question
  • ggplot2极坐标图轴标签位置

    This is just a extension for a old question ggplot2 polar plot arrows https stackoverflow com questions 10515703 ggplot2
  • 重塑错误 - 无效的“row.names”长度

    我有以下数据库 宽格式 st all 其中有两个我希望重塑的变量 P 和 PLC 主题的 ID 是 g id g id study condition sample PLC1 PLC2 PLC3 PLC4 PLC5 PLC6 PLC7 PL
  • OpenBUGS:伯努利分布中缺失值

    我正在尝试通过 R R2OpenBUGS 使用 OpenBUGS 将观察 时间 建模为随机变量 如果所有观察时间都可用 没有 NA 则一切正常 但如果我将其中一个时间设置为 NA 则什么也不会发生 我使用 WinBUGS 测试了相同的代码
  • 如何在 R 中解析年份+周数?

    有没有一种好方法可以将年 周数转换为R中的日期 我已经尝试过以下方法 gt as POSIXct 2008 41 format Y U 1 2008 02 21 EST gt as POSIXct 2008 42 format Y U 1
  • R 中具有重叠样本的分割向量

    假设我有一个包含 1000 个值的向量 我想将此向量 拆分 分区 分组 为多个向量 每个向量包含 200 个值 并且它们之间有 100 个值的重叠 E g vec seq 1 1000 splitWithOverlap vec 200 10
  • 在 R 中执行 read.csv 时未读取所有行

    这是输入文件 http www yourfilelink com get php fid 841283 http www yourfilelink com get php fid 841283 我执行了 options stringsAsF
  • 如果包已经加载,那么在函数中需要包会有什么影响?

    加入有没有什么不良影响library require函数内的语句会被频繁调用吗 所用的时间似乎可以忽略不计 但我每隔几分钟调用该函数 我想知道重复是否有任何缺点require calls 请注意 该功能只是个人实用程序 不被共享 即 我是唯
  • 嵌套循环中的索引

    我是 R 和这个网站的新手 我的目标是创建一个 R 函数 在 ggplot2 中生成特殊类型的箱线图 这肯定是不必要的晦涩难懂的代码 我首先需要通过计算稍后希望绘制的变量来处理其中的潜在输入 我首先生成一些随机数据 称为datos c1 r
  • R中按字母顺序对每一行字符串进行排序

    我环顾四周 似乎找不到解决这个问题的好方法 我有一个包含行名称的列 我想按字母顺序对每一行进行排序 以便稍后可以识别具有相同名称但顺序不同的行 数据如下 names lt c John D Josh C Karl H John D Bob

随机推荐

  • c# 向 Windows 用户授予“作为服务登录”权限

    如何向用户授予服务的 LogOnAsService 权限 我需要手动执行此操作 在服务 msc我可以转到该服务 更改密码 设置与之前相同 单击 应用 然后收到一条消息 帐户 postgres 已 授予 作为服务登录 权限 我如何从代码中执行
  • 如何手动重新渲染组件 Angular 5

    有没有办法可以手动重新渲染组件 比如当用户单击按钮时 我看过类似的帖子 但这些帖子都不适合我here https stackoverflow com questions 35105374 how to force a components
  • pytorch错误:CrossEntropyLoss()不支持多目标

    我正在进行一个使用加速度数据来预测某些活动的项目 但我在损失计算上有问题 我在用CrossEntropyLoss for it 数据如下所示 我使用每行的前 4 个数据来预测索引 就像每行的最后一个数据一样 1 84 84 81 4 81
  • python 中 int() 违反直觉的行为

    中明确指出docs https docs python org 3 5 library functions html intint number 是一个地板类型转换 int 1 23 1 当且仅当字符串是整数文字时 int string 返
  • 查询视图时,视图定义中的过滤子句将被忽略

    我有一张桌子SCHEDULES有柱子LDATE and SCHTYPEID If SCHTYPEID 1 那么LDATE包含数字格式的日期 例如 20170918 表示今天的日期 如果SCHTYPEID 2 那么LDATE包含 0 在编写查
  • 在显示来自 viewDidload 的警报之前显示来自应用程序委托的警报

    我正在尝试通过应用程序委托显示推送通知中包含的消息 如 parse com 文档中所述 我遇到的问题是 在我的第一个视图控制器的 viewdidload 方法中 我呈现了一个警告 用户在使用该应用程序之前必须看到该警告 用户从 viewdi
  • 从另一个 C++ 程序编译 C++ 源代码

    我正在制作一个从 Brainfuck 到 C 的编译器 并且我已经完成了所有内容 直到我实际编译程序创建的 cpp 文件 我真的更希望编译器实际上能够生成可执行文件 而不仅仅是 C 的源代码 那么我该如何在 Windows 上执行此操作呢
  • 您使用什么材料来学习 Flex/Air 以及 ColdFusion + BlazeDS/LCDS? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Nginx / PHP-FPM 504 网关超时

    我正在将 php fpm 与 nginx 一起使用 我有一些脚本可以获取上传的 Excel 工作表并对其进行处理 这是一项长期的工作 但是 执行 60 秒后 我收到 504 Gateway Timeout 错误 php 脚本继续运行直至完成
  • 根据商店营业时间有效确定企业是否营业

    给定时间 例如 目前周二下午 4 24 我希望能够从一组企业中选择当前正在营业的所有企业 我有一周中每一天每个企业的营业时间和休息时间 假设一家企业只能在每小时 00 15 30 45 分钟处开门 关门 我假设每周都有相同的时间表 我最感兴
  • 如何在 for 循环中重用 ES6 javascript 中的生成器?

    我正在尝试编写一个可以接受列表或生成器作为输入的函数 例如这个函数 function x l for let i of l console log i for let i of l console log i 如果我像这样运行它 x 1 2
  • jqGrid:如果主键列被编辑,如何更新行ID

    主键值用作从服务器返回的 json 数据中的行 ID 如果主键值被编辑并保存两次 第二次保存会因jqGrid而出错 再次将原始主键值传递给编辑方法 如果在内联编辑中更改主键值 如何将 jqGrid 行 ID 更新为新的主键值 functio
  • 从 Java/C# 到 C++ 的最佳方式是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 注入修改后的 Spring 安全表达式语言实现后,“需要调试符号信息 (...)”

    我有一个示例类要测试 PreAuthorize注释 看起来或多或少像这样 class BankService PreAuthorize hasCustomRole ROLE CUSTOM or hasRole ROLE EXAMPLE Do
  • 从 SQL Server 数据库生成 DDL 脚本

    如何使用 SQL 选择 存储过程 等 从 SQL Server 数据库生成所有表的 DDL 带有外键 索引等 脚本 除了数据之外我需要一切 I can t使用 Sql Server Management Studio 因为我想在将在 Lin
  • Python重新加载模块不会立即生效

    请参阅下面的复制代码 跟踪内存泄漏我发现 reload module 不会立即生效 下面的程序应该打印 0 1 2 3 4 但是 当快速执行时 它会打印 0 0 0 3 3 等序列 将 sleep 函数中的时间增加到例如 1 秒似乎可以解决
  • 如何在 Swift 中使用 addAttribute

    我正在尝试添加到 UITextViews 的链接 因此我按照以下代码进行操作这个帖子 http www raywenderlich com 48001 easily overlooked new features ios 7 textVie
  • iphone - 带有返回值的performSelectorOnMainThread

    我有以下方法 NSMutableArray getElements NSString theURL 我想知道是否有一种方法可以使用 PerformSelectorOnMainThread 来调用该方法 以便我可以获得返回值 到目前为止 我已
  • 我可以在 Visual Studio 2012 中编译和调试(运行)单个 C++ 文件吗? (如何避免创建过多的项目)

    我正在从一本书中学习 C 并使用 Visual Studio 2012 为了遵循本书的练习 我需要创建多个 cpp 文件 其中包含 main 函数 有什么方法可以编译 调试我的程序 而无需每次都创建新项目 例如 如果我写一个简单的 Hell
  • R 在使用 case_when 时提供参数(R 向量化)

    这是我之前提出的问题的后续问题 当存在大量类别 类型时 R 使用 case when R 向量化 应用多个函数 https stackoverflow com questions 62377561 r apply multiple func