4

诚然,这是一个非常简单的问题,我只是找不到答案。

在 R 中,我有一个包含 2 列的文件:1 列是分类数据名称,第二列是计数列(每个类别的计数)。对于一个小数据集,我会使用“reshape”和“untable”函数来制作 1 列并以这种方式进行分析。问题是,如何用大数据集处理这个问题?

在这种情况下,我的数据是巨大的,那是行不通的。

我的问题是,我如何告诉 R 使用以下内容作为分布数据:

Cat Count
A   5
B   7
C   1

也就是说,我给它一个直方图作为输入,并让 R 在计算有关数据的其他信息时计算出这意味着有 5 个 A、7 个 B 和 1 个 C。

所需的输入而不是输出将使 R 理解数据将与以下相同,

A A A A A B B B B B B B C

在合理大小的数据中,我可以自己做,但是当数据非常大时怎么办?

编辑

所有计数的总和为 262,916,849。

就它的用途而言:

这是新数据,试图了解这些新数据与其他数据之间的相关性。需要处理线性回归和混合模型。

4

4 回答 4

7

认为您要问的是重塑类别的数据框并将其计数为单个观察向量,其中类别重复。这是一种方法:

dat <- data.frame(Cat=LETTERS[1:3],Count=c(5,7,1))
#  Cat Count
#1   A     5
#2   B     7
#3   C     1
rep.int(dat$Cat,times=dat$Count)
# [1] A A A A A B B B B B B B C
#Levels: A B C
于 2012-09-11T18:46:57.110 回答
4

为了跟进@Blue Magister 的出色回答,这里有一个 100,000 行的直方图,总数为 551,245,193:

set.seed(42)
Cat <- sapply(rep(10, 100000), function(x) {
  paste(sample(LETTERS, x, replace=TRUE), collapse='')
  })
dat <- data.frame(Cat, Count=sample(1000:10000, length(Cat), replace=TRUE))
> head(dat)
         Cat Count
1 XYHVQNTDRS  5154
2 LSYGMYZDMO  4724
3 XDZYCNKXLV  8691
4 TVKRAVAFXP  2429
5 JLAZLYXQZQ  5704
6 IJKUBTREGN  4635

按照我的标准,这是一个相当大的数据集,Blue Magister 描述的操作非常快:

> system.time(x <- rep(dat$Cat,times=dat$Count))
   user  system elapsed 
   4.48    1.95    6.42 

它使用大约 6GB 的 RAM 来完成操作。

于 2012-09-11T19:02:28.793 回答
2

这实际上取决于您要计算的统计数据。该xtabs函数将为您创建表格,您可以在其中指定计数。该Hmisc软件包具有类似的功能wtd.mean,它将采用权重向量来计算平均值(以及用于标准偏差、分位数等的相关函数)。该biglm软件包可用于一次扩展部分数据集并进行分析。可能还有其他软件包可以处理频率数据,但最好取决于您要回答的问题。

于 2012-09-11T19:10:52.020 回答
0

现有的答案都是将预先分箱的数据集扩展为一个完整的分布,然后使用 R 的直方图函数,该函数内存效率低,并且不会像原始海报所询问的那样针对非常大的数据集进行扩展。HistogramTools CRAN 包包含一个 函数,该PreBinnedHistogram函数接受中断和计数的参数以在 R 中创建直方图对象,而无需大规模扩展数据集。

例如,如果数据集有 3 个包含 5、7 和 1 个元素的桶,那么到目前为止发布的所有其他解决方案都先将其扩展为 13 个元素的列表,然后创建直方图。 PreBinnedHistogram相反,直接从 3 元素输入列表创建直方图,而不在内存中创建更大的中间向量。

big.histogram <- PreBinnedHistogram(my.data$breaks, my.data$counts)
于 2014-12-08T20:38:03.220 回答