2017-03-29 29 views
0

我有一个.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 

是否可以完成这种任务?

回答

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组中的分组结果因该分组实体而失败,并且从结果中删除。

这里是link到其他组的治疗使用data.tableddply。您也可以通过plyrtapply来实现此目的。

+0

谢谢你,这是更容易阅读。当你发布这个时,我实际上正在查看dplyr软件包! – Michael

+0

@迈克尔,这不给你数量,但臭氧测量的总和。这是一个完全不同的问题。如果你努力阅读函数'table',你可能想研究更多一点。我喜欢'dplyr'包裹,在这种情况下,您使用的是火箭筒拍摄蚊子。如果你真的需要计数,那就是...... –

+0

'table'一直是我的快速列表。如果需要,对于频繁与R交互的人来说,阅读和转换很容易。正如@ joris-meys所指出的那样,上述解决方案确实适用于“求和”,主要是因为我没有一个现成的数据集,我可以很容易地让这个点通过并且可以重现。在任何分组变量中使用'length'会给出我在解决方案中提到的计数。 – Drj

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我表。这有助于转换。

+0

谢谢。这几乎是我所需要的。现在,只有当我可以使读者更友好... – Michael