替换R中的for循环
我试图在编写代码时停止使用for循环,但在表示一个简单的操作时遇到了一点问题 比如说,我正试图对一家拥有多家餐厅的公司的数据集进行简单的最近邻估计。我有三个特点:城市,商店,月和一个目标函数销售。城市、商店和月份都用数字表示:城市取值范围为1-100,商店取值范围为1-50,月份取值范围为1-12 现在,我想用apply函数替换for循环:替换R中的for循环,r,for-loop,R,For Loop,我试图在编写代码时停止使用for循环,但在表示一个简单的操作时遇到了一点问题 比如说,我正试图对一家拥有多家餐厅的公司的数据集进行简单的最近邻估计。我有三个特点:城市,商店,月和一个目标函数销售。城市、商店和月份都用数字表示:城市取值范围为1-100,商店取值范围为1-50,月份取值范围为1-12 现在,我想用apply函数替换for循环: for (c in 1:100){ for (s in 1:50){ for (m in 1:12){ dat1$Sales[dat1$City
for (c in 1:100){
for (s in 1:50){
for (m in 1:12){
dat1$Sales[dat1$City==c & dat1$Store==s & dat1$Month==m & is.na(dat1$Sales)] <-
mean(dat1$Sales[dat1$City==c & dat1$Store==s & dat1$Month==m & !is.na(dat1$Sales)])
}
}
}
for(1:100中的c){
对于(1:50中的s){
对于(1:12中的m){
dat1$Sales[dat1$City==c&dat1$Store==s&dat1$MOUNT==m&is.na(dat1$Sales)]尝试使用aggregate
。它有一个公式
类似的界面,可以轻松获得应用于数据.frame
部分的函数的结果。然后只需将结果分配到dat1
中需要它的地方即可
TempOut<- aggregate(Sales~City+Store+Month, FUN=mean,data=dat1)
dat1$Sales[is.na(dat1$Sales),]<-TempOut[TempOut$City==[dat1[is.na(dat1$Sales),]$City
& TempOut$Store==[dat1[is.na(dat1$Sales),]$Store & TempOut$Month==
[dat1[is.na(dat1$Sales),]$Month,]$Sales
TempOut尝试使用aggregate
。它有一个类似公式的界面,可以很容易地获得应用于data.frame
部分的函数的结果。然后只需将结果分配到dat1
中需要它的位置即可
TempOut<- aggregate(Sales~City+Store+Month, FUN=mean,data=dat1)
dat1$Sales[is.na(dat1$Sales),]<-TempOut[TempOut$City==[dat1[is.na(dat1$Sales),]$City
& TempOut$Store==[dat1[is.na(dat1$Sales),]$Store & TempOut$Month==
[dat1[is.na(dat1$Sales),]$Month,]$Sales
TempOut这里有一个数据表
方式:
require(data.table)
setDT(dat1)
dat1[, Sales:={
m=mean(Sales,na.rm=TRUE)
replace(Sales, is.na(Sales), m)
},by=.(City, Store, Month)]
如果有像Sales[is.na(Sales)]:=…
这样的东西会很好,但这只是一个现在。这里是。这里是一个数据。表
方式:
require(data.table)
setDT(dat1)
dat1[, Sales:={
m=mean(Sales,na.rm=TRUE)
replace(Sales, is.na(Sales), m)
},by=.(City, Store, Month)]
如果有类似于Sales[is.na(Sales)]:=…
的东西会很好,但这只是一个暂时的问题。下面是使用data.table,dat1[,Sales:=Sales[!is.na(Sales)],by='c,s,m'.
请查看.adput()一些数据框的
很酷,可以帮助人们帮助你。这是干什么的?乍一看,看起来你只是删除了sales为NA的行。你能再给我们看一点数据框吗?啊,我没有注意到的意思
。在这种情况下,dat1[,sales:=mean(sales[!is.NA(sales)],by='c,s,m']
@Frank将使用data.table,dat1[,Sales:=Sales[!is.NA(Sales)],by='c,s,m']替换所有Sales
值的平均值或仅那些Sales
为NA
,请查看.adput()一些数据框的
很酷,可以帮助人们帮助你。这是干什么的?乍一看,看起来你只是删除了sales为NA的行。你能再给我们看一点数据框吗?啊,我没有注意到的意思
。在这种情况下,dat1[,sales:=mean(sales[!is.NA(sales)],by='c,s,m']
@Frank将所有销售
值替换为平均值,还是仅替换那些销售
值,即NA
?