[当使用case_when(R向量化)时存在大量类别/类型时,R应用多种功能

问题描述 投票:0回答:1

假设我具有以下形式的数据集:

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多个城市的信息。假设,对于每个城市(我也称为“类型”),我需要应用以下功能:

#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)
}

再次,以上两个功能是我用于说明的极其简单的功能。这里的想法是,对于每个城市(或“类型”),我需要为数据集中的每一行运行一个不同的函数。在上面的两个函数中,我使用了rnorm来检查并确保我们为每行绘制不同的值。

现在,对于整个数据集,我想先将观测值划分为其不同的城市(或“类型”)。我可以使用(zz_new [[“ City”]] == 1)[也请参见下文]。然后为每个类运行各自的功能。但是,当我运行下面的代码时,得到-Inf

有人可以帮助我了解为什么会这样吗?

对于示例数据,我希望获得某个随机值的20加10倍(对于类型= 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[,])
)

非常感谢。

r vectorization case-when
1个回答
0
投票

让我们看一下您的代码。我重写了您的代码

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[,])
)

to

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

© www.soinside.com 2019 - 2024. All rights reserved.