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

问题描述 投票:2回答:1

这是我之前提出的问题(R apply multiple functions when large number of categories/types are present using case_when (R vectorization))的后续问题。不幸的是,我无法解决问题。我想我可能已经缩小了问题的根源,希望检查是否有人比我有更好的了解可以帮助我找到解决方案。

假设我有以下数据集:

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)

这里假定存在两个不同的业务,分别为“ A”和“ B”。进一步假设存在两个不同的城市City1和City2。我的原始数据集包含约200,000个观测值,涉及多个企业和约100个城市。对于每个城市,我都有一个独特的预先编写的函数来计算调整后的收入。而不是通过每个观察/行运行它们,我想在运行相关城市的功能时使用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)中减去一些random number再次,这些简单的功能仅用于说明,并不反映实际的功能。我还手动检查这些功能是否可以通过键入以下内容进行检查:

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

这里,对于观察值1和4以及2和3,调整后的值相同]。相反,我期望的是为每个观察值获取不同的值(因为我为每个观察值添加或删除了一些随机数;或者至少打算这样做)。在Martin Gal对我之前的问题(https://stackoverflow.com/a/62378991/3988575)做出回答之后,我怀疑这是由于在最后一步中未正确调用City1和City2函数的第二个参数。但是,我有点迷失了试图找出原因和修复方法。

如果有人可以指出发生这种情况的原因以及如何解决此错误,这将非常有帮助。预先感谢!

P.S。我也欢迎其他向量化解决方案。我对向量化还比较陌生,没有太多经验,希望您能提出任何建议。

r vectorization case-when
1个回答
0
投票

City功能转换为dplyr。如果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_)
}

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
© www.soinside.com 2019 - 2024. All rights reserved.