这是我之前提出的问题(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。我也欢迎其他向量化解决方案。我对向量化还比较陌生,没有太多经验,希望您能提出任何建议。
将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