【问题标题】:using aggregate to generate report based on multiple categories in r使用聚合生成基于 r 中多个类别的报告
【发布时间】:2017-03-29 16:13:26
【问题描述】:

我有一个 .dbf,其中包含大约 280 万条记录,其中包含住宅地块数据,其中包含年份建造类别字段、县代码字段和风区字段(用于建筑代码限制)。有 3 年建成类别和 5 个风区。我需要获取每个县每个风区中每年建造类别的地块数量。基本上我有一个县 (CNTY_ID = 11),有三年建成的类别 (BUILT_CAT = "1" 、 "2" 、 "3"),每个类别也分配给五个风速类别之一 (WINDSPEED = "100"、"110 ”、“120”等)。我想我需要使用 aggregate() 函数,但没有任何运气。最理想的生成表应该是这样的:

CNTY_ID = 11
                  BUILT_CAT 
             1        2        3
WINDSPEED
   100       x        x        x
   120       x        x        x
    .
    .
    .
   150       x        x        x

CNTY_ID = 12
                  BUILT_CAT 
             1        2        3
WINDSPEED
   100       x        x        x
   120       x        x        x
    .
    .
    .
   150       x        x        x

这样的任务有可能完成吗?

【问题讨论】:

    标签: r dataframe aggregate


    【解决方案1】:

    实际上,您最好使用table,这样更省事、更高效。你得到一个数组,这个数组很容易转换为一个数据框。

    一些测试数据:

    n <- 10000
    df <- data.frame(
      windspeed = sample(c(110,120,130), n, TRUE),
      built_cat = sample(c(1,2,3),n,TRUE),
      cnty_id = sample(1:20,n,TRUE)
    )
    

    构造表并转换为数据框:

    tbl <- with(df, table(windspeed, built_cat, cnty_id))
    as.data.frame(tbl)
    

    请注意,我在这里使用with,因此我将变量名自动作为表的暗名。这有助于转化。

    【讨论】:

    • 谢谢。这几乎正​​是我所需要的。现在只要我能让它对读者更友好......
    【解决方案2】:

    您本质上需要的是一种对数据进行分组的方法。

    我认为dplyr 是要走的路。你也可以使用aggregate

    使用dplyr

    library(dplyr)
    library(datasets)
    
    temp <- airquality %>% 
      group_by(Month, Day) %>% 
      summarise(TOT = sum(Ozone))
    
    View(temp)
    

    这将为您提供标准化格式的数据,其中数据首先按Month 分组,然后按月份的Day 分组,然后对提供的变量求和。 Ozone 在这种情况下。您也可以改用length 来计算值。

    使用aggregate

    temp2 <- aggregate(Ozone ~ Month + Day, data = airquality, sum)
    View(temp2)
    

    该方法的主要区别在于NA 的处理方式。

    由于基本 R 函数没有对NAs 进行非常直观的处理,因此只要遇到它就会添加记录。因此,sum 分组的结果对该分组实体失败,并从结果中删除。

    这里是一个link 到其他组,使用data.tableddply 进行处理。您也可以通过plyrtapply 来实现。

    【讨论】:

    • 谢谢,这更容易阅读。当您发布此内容时,我实际上正在查看 dplyr 包!
    • @Michael 这不会给你计数,而是臭氧测量值的总和。这是一个完全不同的问题。如果您难以阅读函数table,您可能需要多学习R。我多么喜欢dplyr 包,在这种情况下,您使用火箭筒射击蚊子。如果你真的需要计数,那就是......
    • table 是我快速制表的首选。如果需要,对于经常与 R 交互的人来说,它很容易阅读和转换。正如@joris-meys 指出的那样,上述解决方案确实适用于sum,主要是因为我没有一个现成的数据集,我可以很容易地理解这一点并且可以重现。在按变量分组的任何变量上使用 length 都会给出计数,我在解决方案中提到了这一点。
    • 尝试使用我的示例数据并将 sum(Ozone) 替换为 length()。不工作。聚合在左侧还需要一个额外的变量。因此,这同样不适用于 OP 描述的情况。
    • @joris-meys 我同意aggregate 不太灵活,总是需要多一个变量。 dplyrtable 不受相同约束。无论如何,我只是想放弃供 OP 使用的选项。我认为这里重要的是,他对解决他的问题的各种技术有一些见解,并看到了 R 在行动中的灵活性。
    猜你喜欢
    • 2021-10-12
    • 1970-01-01
    • 2015-05-17
    • 2018-11-21
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    相关资源
    最近更新 更多