簡體   English   中英

R 使用 case_when(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))

我的實際數據集包含大約 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM