R 在使用 case_when 时提供参数(R 向量化)
R supplying arguments while 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)
这里假设存在 2 个不同的业务,名为 "A" 和 "B"。进一步假设存在两个不同的城市City1 和City2。我的原始数据集包含大约 20 万个观察值,涉及多个企业和大约 100 个城市。对于每个城市,我都有一个独特的预写函数来计算调整后的收入。我想使用 case_when 到 运行 相关城市的函数,而不是 运行 对它们进行 observation/row 处理(例如,对城市 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
此处,对于观测值 1 和 4 & 2 和 3,调整后的值相同。相反,我期望的是为每个观察获得不同的值(因为我为每个观察添加或删除了一些随机数;或者至少打算这样做)。按照 Martin Gal 对我上一个问题 () 的回答,我怀疑这是由于在最后一步没有正确调用我的 City1 和 City2 函数的第二个参数。但是,我在试图弄清楚为什么以及如何解决它时有些迷茫。
如果有人能指出发生这种情况的原因以及如何修复此错误,那将非常有帮助。提前致谢!
P.S。
我也对其他矢量化解决方案持开放态度。我对矢量化比较陌生,没有太多经验,如果有任何建议,我将不胜感激。
已将 City
函数转换为 dplyr
。如果 CityMaster
对于最终函数来说过于简化,那么 mer
可以移到 case_when
中(如果适用)。如果将新城市添加到数据中,那么它将 return 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_))
这是我之前提出的问题 (
假设我有以下数据集:
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。我的原始数据集包含大约 20 万个观察值,涉及多个企业和大约 100 个城市。对于每个城市,我都有一个独特的预写函数来计算调整后的收入。我想使用 case_when 到 运行 相关城市的函数,而不是 运行 对它们进行 observation/row 处理(例如,对城市 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
此处,对于观测值 1 和 4 & 2 和 3,调整后的值相同。相反,我期望的是为每个观察获得不同的值(因为我为每个观察添加或删除了一些随机数;或者至少打算这样做)。按照 Martin Gal 对我上一个问题 (
如果有人能指出发生这种情况的原因以及如何修复此错误,那将非常有帮助。提前致谢!
P.S。 我也对其他矢量化解决方案持开放态度。我对矢量化比较陌生,没有太多经验,如果有任何建议,我将不胜感激。
已将 City
函数转换为 dplyr
。如果 CityMaster
对于最终函数来说过于简化,那么 mer
可以移到 case_when
中(如果适用)。如果将新城市添加到数据中,那么它将 return 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_))