当使用 case_when(R 矢量化)存在大量 categories/types 时,R 应用多个函数
R apply multiple functions when large number of categories/types are present using case_when (R vectorization)
假设我有以下形式的数据集:
City=c(1,2,2,1)
Business=c(2,1,1,2)
ExpectedRevenue=c(35,20,15,19)
zz=data.frame(City,Business,ExpectedRevenue)
zz_new=do.call("rbind", replicate(zz, n=30, simplify = FALSE))
我的实际数据集包含大约 20 万行。此外,它还包含 100 多个城市的信息。
假设,对于每个城市(我也称之为 "Type"),我有以下需要应用的函数:
#Writing the custom functions for the categories here
Type1=function(full_data,observation){
NewSet=full_data[which(!full_data$City==observation$City),]
BusinessMax = max(NewSet$ExpectedRevenue)+10*rnorm(1)
return(BusinessMax)
}
Type2=function(full_data,observation){
NewSet=full_data[which(!full_data$City==observation$City),]
BusinessMax = max(NewSet$ExpectedRevenue)-100*rnorm(1)
return(BusinessMax)
}
再一次上面两个函数是我用来说明的非常简单的函数。这里的想法是,对于每个城市(或 "Type"),我需要为数据集中的每一行 运行 一个不同的函数。在上面的两个函数中,我使用了 rnorm 来检查并确保我们为每一行绘制了不同的值。
现在对于整个数据集,我想首先将观察分为不同的城市(或 "Types")。我可以使用 (zz_new[["City"]]==1) [另见下文] 来做到这一点。然后 运行 每个 类 各自的功能。但是,当我 运行 下面的代码时,我得到 -Inf。
谁能帮我理解为什么会这样?
对于示例数据,我希望获得 20 加 10 乘以某个随机值(对于 Type =1)和 35 减去 100 乘以某个随机值(对于 Type=2)。每行的值也应该不同,因为我是从随机正态分布中绘制它们的。
library(dplyr) #I use dplyr here
zz_new[,"AdjustedRevenue"] = case_when(
zz_new[["City"]]==1~Type1(full_data=zz_new,observation=zz_new[,]),
zz_new[["City"]]==2~Type2(full_data=zz_new,observation=zz_new[,])
)
非常感谢。
让我们看一下您的代码。
我重写你的代码
library(dplyr)
zz_new[,"AdjustedRevenue"] = case_when(
zz_new[["City"]]==1~Type1(full_data=zz_new,observation=zz_new[,]),
zz_new[["City"]]==2~Type2(full_data=zz_new,observation=zz_new[,])
)
至
zz_new %>%
mutate(AdjustedRevenue = case_when(City == 1 ~ Type1(zz_new,zz_new),
City == 2 ~ Type2(zz_new,zz_new)))
因为您正在使用 dplyr
但不要使用此软件包提供的强大工具。
除了 mutate
的用法外,一个关键的变化是我将 zz_new[,]
替换为 zz_new
。现在我们看到你的 Type
-函数的两个参数是相同的数据帧。
下一步:查看您的函数
Type1 <- function(full_data,observation){
NewSet=full_data[which(!full_data$City==observation$City),]
BusinessMax = max(NewSet$ExpectedRevenue)+10*rnorm(1)
return(BusinessMax)
}
由 Type1(zz_new,zz_new)
调用。所以NewSet
的定义给了我们
NewSet=full_data[which(!full_data$City==observation$City),]
# replace the arguments
NewSet <- zz_new[which(!zz_new$City==zz_new$City),]
因此 NewSet
始终是具有零行的数据框。将 max
应用于 data.frame 的空列会产生 -Inf
.
假设我有以下形式的数据集:
City=c(1,2,2,1)
Business=c(2,1,1,2)
ExpectedRevenue=c(35,20,15,19)
zz=data.frame(City,Business,ExpectedRevenue)
zz_new=do.call("rbind", replicate(zz, n=30, simplify = FALSE))
我的实际数据集包含大约 20 万行。此外,它还包含 100 多个城市的信息。 假设,对于每个城市(我也称之为 "Type"),我有以下需要应用的函数:
#Writing the custom functions for the categories here
Type1=function(full_data,observation){
NewSet=full_data[which(!full_data$City==observation$City),]
BusinessMax = max(NewSet$ExpectedRevenue)+10*rnorm(1)
return(BusinessMax)
}
Type2=function(full_data,observation){
NewSet=full_data[which(!full_data$City==observation$City),]
BusinessMax = max(NewSet$ExpectedRevenue)-100*rnorm(1)
return(BusinessMax)
}
再一次上面两个函数是我用来说明的非常简单的函数。这里的想法是,对于每个城市(或 "Type"),我需要为数据集中的每一行 运行 一个不同的函数。在上面的两个函数中,我使用了 rnorm 来检查并确保我们为每一行绘制了不同的值。
现在对于整个数据集,我想首先将观察分为不同的城市(或 "Types")。我可以使用 (zz_new[["City"]]==1) [另见下文] 来做到这一点。然后 运行 每个 类 各自的功能。但是,当我 运行 下面的代码时,我得到 -Inf。
谁能帮我理解为什么会这样?
对于示例数据,我希望获得 20 加 10 乘以某个随机值(对于 Type =1)和 35 减去 100 乘以某个随机值(对于 Type=2)。每行的值也应该不同,因为我是从随机正态分布中绘制它们的。
library(dplyr) #I use dplyr here
zz_new[,"AdjustedRevenue"] = case_when(
zz_new[["City"]]==1~Type1(full_data=zz_new,observation=zz_new[,]),
zz_new[["City"]]==2~Type2(full_data=zz_new,observation=zz_new[,])
)
非常感谢。
让我们看一下您的代码。 我重写你的代码
library(dplyr)
zz_new[,"AdjustedRevenue"] = case_when(
zz_new[["City"]]==1~Type1(full_data=zz_new,observation=zz_new[,]),
zz_new[["City"]]==2~Type2(full_data=zz_new,observation=zz_new[,])
)
至
zz_new %>%
mutate(AdjustedRevenue = case_when(City == 1 ~ Type1(zz_new,zz_new),
City == 2 ~ Type2(zz_new,zz_new)))
因为您正在使用 dplyr
但不要使用此软件包提供的强大工具。
除了 mutate
的用法外,一个关键的变化是我将 zz_new[,]
替换为 zz_new
。现在我们看到你的 Type
-函数的两个参数是相同的数据帧。
下一步:查看您的函数
Type1 <- function(full_data,observation){
NewSet=full_data[which(!full_data$City==observation$City),]
BusinessMax = max(NewSet$ExpectedRevenue)+10*rnorm(1)
return(BusinessMax)
}
由 Type1(zz_new,zz_new)
调用。所以NewSet
的定义给了我们
NewSet=full_data[which(!full_data$City==observation$City),]
# replace the arguments
NewSet <- zz_new[which(!zz_new$City==zz_new$City),]
因此 NewSet
始终是具有零行的数据框。将 max
应用于 data.frame 的空列会产生 -Inf
.