【发布时间】:2012-04-27 09:33:03
【问题描述】:
我正在尝试重塑/减少我的数据。到目前为止,我使用了for 循环(非常慢),但据我所知,Plyr 应该很快。
我有很多组(公司,作为数据集中的一个因素),我想完全删除所有在该公司的任何单元格中显示 value 为 0 条目的公司。因此,我创建了一个新的data.frame,但在某些时候忽略了所有为value 显示0 的组。
forloop:
Data Creation:
set.seed(1)
mydf <- data.frame(firmname = sample(LETTERS[1:5], 40, replace = TRUE),
value = rpois(40, 2))
-----------------------------
splitby = mydf$firmname
new.data <- data.frame()
for (i in 1:(length(unique(splitby)))) {
temp <- subset(mydf, splitby == as.character(paste(unique(splitby)[i])))
if (all(temp$value > 0) == "TRUE") {
new.data <- rbind(new.data, temp)
}
}
Delete all empty firm factors
new.data$splitby <- factor(new.data$splitby)
有没有办法通过plyr 包实现这一目标? subset 函数可以在那种情况下使用吗?
编辑:为了重现问题,添加了 BenBarnes 建议的数据创建。本,非常感谢。此外,我的代码已更改,以符合下面提供的答案。
【问题讨论】:
-
您不提供样本数据,但这听起来像是使用
[运算符的标准子集。 -
@Andrie 在我看来,他想删除一个组中的所有条目,其中任何条目都符合某些条件。所以
plyr或by似乎更容易。 Jan,请阅读此内容,因为它将帮助我们解决您的问题:stackoverflow.com/questions/5963269/… -
非常感谢您的回答!我按照 Ben 的建议编辑了帖子并添加了数据复制(见下文)。
-
@Andrie:非常感谢!标准子集实际上是我需要的。计算上,我的 for 循环需要 122 秒,而我的小测试数据集(~55k 观察),Plyr 17 秒和 [] 操作仅 0.07!