![](/img/trans.png)
[英]R supplying arguments while using case_when (R vectorization)
[英]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))
我的實際數據集包含大約 200K 行。 此外,它還包含 100 多個城市的信息。 假設,對於每個城市(我也稱之為“類型”),我有以下需要應用的功能:
#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)
}
再一次,上面兩個函數是我用來說明的非常簡單的函數。 這里的想法是,對於每個城市(或“類型”),我需要為數據集中的每一行運行不同的 function。 在上述兩個函數中,我使用 rnorm 來檢查並確保我們為每一行繪制不同的值。
現在對於整個數據集,我想首先將觀察結果划分為不同的城市(或“類型”)。 我可以使用 (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
但不要使用此 package 提供的強大工具。
除了使用mutate
之外,一個關鍵的變化是我用zz_new
替換zz_new[,]
。 現在我們看到您的Type
函數的兩個 arguments 都是相同的 dataframe。
下一步:看看你的 function
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
始終是一個零行的 dataframe。 將max
應用於-Inf
的空列會產生 -Inf 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.