使用聚合生成基于r

时间:2017-03-29 16:13:26

标签: r dataframe aggregate

我有一个.dbf,其中包含大约280万条记录,其中包含住宅包裹数据,其中包含年份类别字段,县代码字段和windzone字段(用于构建代码限制)。有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

这种任务是否可以完成?

2 个答案:

答案 0 :(得分: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所以我自动将变量名称作为我的表的dimnames。这有助于转换。

答案 1 :(得分:0)

您实际需要的是一种分组数据的方法。

我认为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组中的组对该分组实体失败,并从结果中删除。

以下是使用data.tableddply进行治疗的其他组link。您也可以通过plyrtapply来实现此目标。