【发布时间】:2014-01-27 17:37:08
【问题描述】:
我有一个包含作者和相应文本的大型数据框(大约 450,000 条记录)。从数据框中,我分别提取了作者和文本的两个向量,例如:
author <- c("Sallust",
"Tacitus",
"Justin",
"Cato the Elder",
"Claudius",
"Quintus Fabius Pictor",
"Justin",
"Claudius",
"Cato the Elder",
"Tacitus",
"Sallust")
text <- c("Lorem ipsum dolor sit amet",
"Lorem ipsum dolor sit amet",
"Lorem ipsum dolor sit amet",
"Lorem ipsum dolor sit amet",
"Lorem ipsum dolor sit amet",
"Lorem ipsum dolor sit amet",
"Lorem ipsum dolor sit amet",
"Lorem ipsum dolor sit amet",
"Lorem ipsum dolor sit amet",
"Lorem ipsum dolor sit amet",
"Lorem ipsum dolor sit amet")
我的目标是在足够小的卡盘中对数据集进行子集化,以便进行文本挖掘,但仍将具有相同 author 的所有记录保留在同一块中。
我注意到从原始数据帧中提取向量 author 和 text 速度很快,但在新数据帧中组合提取的向量非常慢。所以我想我应该避免使用所有记录创建数据框。
“聪明”的解决方案可能是:
- 按字母顺序排列矢量
author(以确保记录 与同一作者是连续的); - 根据向量的排序对向量
text进行排序author; - 创建一个逻辑向量 (TRUE/FALSE) 指示作者是否是 上一个值的同一作者;
- 创建一个包含向量索引的向量
splitAtauthor和text在哪里拆分; - 分割向量。
在代码中,假设我的过程是有意义的,我的前 3 个步骤正常工作:
# Sort vectors
order <- order(author)
author <- author[order]
text <- text[order]
same_author <- duplicated(author)
但我不知道如何进一步进行。大概应该是这样的:
# Index for splitting
max_length <- 2
num_records <- length(author)
num_chunks <- as.integer((num_records %/% max_length)) - 1
# Initialise vector (not sure it needs value 2 to indicate first index where to split)
splitAt <- 1
for (n in num_chunks){
index <- n * max_length + 1
while (same_author[index]!=FALSE) {
splitAt <- append(splitAt, index)
index <- index + 1
}
}
【问题讨论】:
-
我不明白您为什么要从数据框中提取向量。你为什么不直接用 plyr::ddply() 处理作者的df?
-
整个数据集实际上是两个 df 的合并(都具有属性
author和text,但也具有非共享属性,这使得它们“不可绑定”)。我从两个df中提取了两个感兴趣的向量,然后将它们组合起来。作为最后一步,我尝试将向量重新组合到一个 df 中,但由于它们的长度为 450,000,因此该过程非常缓慢。我当时想尝试一种不同的方法...... -
只是从
df中的每一个获取author和text and thenrbind`?我认为它也很慢,但可能没有再次创建数据框那么慢...... -
如果你发现
data.frame很慢,那么使用带有适当键的data.table并观察它飞... -
@Llopis 是的,我的想法完全不是重新创建数据框,而是首先处理向量,拆分它们,然后创建多个但很小的 df。