【发布时间】:2016-01-11 18:05:11
【问题描述】:
我是巴西的经济学学生。我有一组房地产数据,街区,房屋类型(公寓,房屋,土地),收集日期(每月),价格,我们需要将它们分组如下:
按每个街区类型的地区,以及每个时期的平均价格,如下所示:
neighborhoods
...
types,
...
Sample dates prices
...
List of real estate
...
通过这种安排,我们需要检查所分析过氧化物的价格变化。
好吧,tapply 函数会自动完成这一切!但是,我的主管说我需要删除样本的异常值并在子组中应用某些过滤器。为此,我对每个端组应用了一个公式,因为对于一个邻域或类型,结果会有所不同。
代码:
bairro <- c("B_FLORESTA", "B_PINHEIRAO", "B_PINHEIRAO", "B_PINHEIRINHO",
"B_LUTHER KING", "B_LUTHER KING", "B_VILA NOVA", "B_VILA NOVA",
"B_NOVA PETROPOLIS", "B_VILA NOVA", "B_INTERIOR", "B_ALVORADA",
"B_SADIA", "B_SADIA", "B_SADIA", "B_SADIA", "B_SADIA", "B_SADIA",
"B_SADIA", "B_JUPTER", "B_JUPTER", "B_FLORESTA", "B_ITALIA",
"B_ITALIA", "B_ITALIA", "B_ITALIA")
tipo <- c("CASA", "CASA", "COMERCIAIS", "CASA", "CASA", "COMERCIAIS",
"APARTAMENTO", "APARTAMENTO", "APARTAMENTO", "APARTAMENTO",
"SITIO", "APARTAMENTO", "CASA", "CASA", "CASA", "CASA",
"TERRENO", "TERRENO", "CASA", "CASA", "CASA", "CASA",
"CASA", "CASA", "CASA", "CASA")
valor <- c(1167, 2500, 1125, 2286, 400, 400, 1500, 1500, 300, 1500, 555,
973, 2500, 2556, 2500, 2556, 600, 850, 2338, 1857, 1857, 2000,
2000, 2063, 2000, 2063)
data <- c("2015_07", "2015_07", "2015_07", "2015_07", "2015_07", "2015_07",
"2015_07", "2015_07", "2015_08", "2015_08", "2015_08", "2015_08",
"2015_08", "2015_08", "2015_08", "2015_08", "2015_08", "2015_08",
"2015_09", "2015_09", "2015_09", "2015_09", "2015_09", "2015_09",
"2015_09", "2015_09")
dados <- data.frame(bairro, tipo, valor, data)
装上它,我用tapply()命令对过滤器使用sum()函数。
tapply(dados$valor, list(dados$tipo, dados$data, dados$bairro), sum)
输出是这样的:
...
, , B_SADIA
2015_07 2015_08 2015_09
APARTAMENTO NA NA NA
CASA NA 10112 2338
COMERCIAIS NA NA NA
SITIO NA NA NA
TERRENO NA 1450 NA
, , B_VILA NOVA
2015_07 2015_08 2015_09
APARTAMENTO 3000 1500 NA
CASA NA NA NA
COMERCIAIS NA NA NA
SITIO NA NA NA
TERRENO NA NA NA
输出正是我所需要的,但是,不要使用 sum() 函数,而是使用下面的工具来获得与上面相同的输出:
homo <- function (a){
a <- a[order(a$valor),]
n <- nrow(a)
# sobra <- rep(NA, n -1)
for(i in 1:n){
a$sobra[i] = round(((a$valor[i+1] / a$valor[i])*100)-100, dig = 2)
}
a <- subset (a, a$sobra < 50)
return (a)
}
homo() 函数正在工作,可以在这里看到:
homo(dados)
但是在tapply中输入homo()函数时,输出是这样的:
> tapply(dados$valor, list(dados$tipo, dados$data, dados$bairro), homo)
Error in a$valor : $ operator is invalid for atomic vectors
Called from: order(a$valor)
嗯,这个帖子,尊贵的朋友,我有什么办法可以解决我的情况?
一开始就认真感谢,
【问题讨论】: