【问题标题】:Function and tapply with errors功能和点击有错误
【发布时间】: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)

嗯,这个帖子,尊贵的朋友,我有什么办法可以解决我的情况?

一开始就认真感谢,

【问题讨论】:

    标签: r tapply


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多