函数和 tapply 有错误

Function and tapply with errors

我在巴西读经济学。我有一组房地产数据,社区,房屋类型(公寓,房屋,土地),收集日期(每月),价格,我们需要将它们分组如下:

按小区在每个街区类型,每个时期的平均价格,是这样的:

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)

嗯,这位post,尊贵的朋友,请问有什么办法可以解决我的情况呢?

一开始就表示诚挚的感谢,

您的函数使用美元符号 $ 语法。它不应该以这种方式在函数中使用。您将需要 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))

谢谢@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))