我是巴西经济学的学生。我有一组房地产数据,社区,房屋类型(公寓,房屋,土地),收集日期(每月),价格,我们需要将它们分组如下:
每个社区类型的区域,以及每个时期的平均价格,如下所示: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)
加载它,我使用sum()函数对过滤器使用tapply()命令。
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)
嗯,这个帖子,高贵的朋友,我能做些什么来解决我的情况呢?
认真地感谢开始,
答案 0 :(得分:2)
您的函数使用美元符号$
语法。它不应该以这种方式用在函数中。您需要a[,"valor"]
代替。但该函数还使用不在tapply
输出中的列,因此在使用时会继续收到错误。
您似乎可以完全替换此功能。使用dplyr
,您可以尝试:
library(dplyr)
dados %>% group_by(tipo, data, bairro) %>%
arrange(valor) %>%
mutate(sobra = round(((lead(valor) / valor)*100)-100, dig = 2)) %>%
filter(sobra < 50)
修改强>
如果您只是删除异常值,可以尝试:
with(homo(dados), tapply(valor, list(tipo, data, bairro), sum))
答案 1 :(得分:1)
感谢@Pierre Lafortune,添加了一些代码,它完美无缺。
遵循最终代码:
dados %>% group_by(tipo, data, bairro) %>%
arrange(pvalor) %>%
mutate(sobra = round(((lead(pvalor) / pvalor)*100)-100, dig = 2)) %>%
filter(sobra < 50) %>%
summarise(pvalor = mean(pvalor))