这是我之前提出的问题的后续问题(当存在大量类别/类型时,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 函数的第二个参数。然而,我在试图找出原因以及如何解决它时有些迷失。
如果有人能指出为什么会发生这种情况以及如何修复此错误,那将非常有帮助。提前致谢!
附:
我也对其他矢量化解决方案持开放态度。我对矢量化比较陌生,没有太多经验,希望得到任何建议。