功能并应用错误

时间:2015-10-13 20:25:40

标签: r tapply

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

每个社区类型的区域,以及每个时期的平均价格,如下所示:

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)

嗯,这个帖子,高贵的朋友,我能做些什么来解决我的情况呢?

认真地感谢开始,

2 个答案:

答案 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))