统计数据

时间:2015-06-05 19:00:26

标签: r data-cleaning

我有两个数据集。一个有200万个案件(个别捐款用于各种原因),另一个有大约38,000个(美国所有邮政编码)。

我想对第一个数据集进行排序,并按邮政编码计算捐赠总数。 (此外,每个邮政编码的总数将按原因细分。)第一个数据集中的每个案例都包括相应捐赠的邮政编码和有关其原因的信息。

有一种有效的方法吗?我(非常新手)可以想到的唯一方法是使用 for ... if 循环来遍历每个案例并逐个计算它们。但是,对于这样大小的数据集来说,这似乎真的很慢。

编辑:谢谢,@ josilber。这让我更接近我正在寻找的东西。

还有一个问题。 table似乎生成频率,对吗?如果我实际上是通过邮政编码为每个原因寻找总和怎么办?例如,如果数据框如下所示:

dat3 <- data.frame(zip = sample(paste("Zip", 1:3), 2000000, replace=TRUE),
        cause = sample(paste("Cause", 1:3), 2000000, replace=TRUE), 
        amt = sample(250:2500, 2000000, replace=TRUE))

假设我想要输出看起来像这样而不是频率而不是频率?

#         Cause 1(amt) Cause 2(amt) Cause 3(amt)
#   Zip 1  (sum)        (sum)       (sum)
#   Zip 2  (sum)        (sum)       (sum)
#   Zip 3  (sum)        (sum)       (sum)
#   etc.    ...          ...         ...

这有意义吗?

2 个答案:

答案 0 :(得分:0)

当然,您可以使用R中的table命令完成您正在寻找的内容。首先,让我们从一个可重现的示例开始(我将创建一个带有2的示例)百万个案例,3个邮政编码和3个原因;我知道你有更多的邮政编码和更多原因,但这不会导致代码运行时间太长而无法运行):

# Data
set.seed(144)
dat <- data.frame(zip = sample(paste("Zip", 1:3), 2000000, replace=TRUE),
                  cause = sample(paste("Cause", 1:3), 2000000, replace=TRUE))

请注意,最好在Stack Overflow中包含一个可重复的示例以及您的所有问题,因为它有助于确保我们了解您的要求!基本上,您应该包括一个样本数据集(就像我刚才包含的那样)以及该数据集的所需输出。

现在,您可以使用table功能计算每个邮政编码中的捐款数量,按原因分类:

table(dat$zip, dat$cause)
#         Cause 1 Cause 2 Cause 3
#   Zip 1  222276  222004  222744
#   Zip 2  222068  222791  222363
#   Zip 3  221015  221930  222809

我的电脑花了大约0.3秒。

答案 1 :(得分:0)

这可行吗? -

aggregate(amt~cause+zip,data=dat3,FUN=sum)


    cause   zip       amt
1 Cause 1 Zip 1 306231179
2 Cause 2 Zip 1 306600943
3 Cause 3 Zip 1 305964165
4 Cause 1 Zip 2 305788668
5 Cause 2 Zip 2 306306940
6 Cause 3 Zip 2 305559305
7 Cause 1 Zip 3 304898918
8 Cause 2 Zip 3 304281568
9 Cause 3 Zip 3 303939326