2

我正在尝试重塑/减少我的数据。到目前为止,我使用了一个for循环(非常慢),但据我所知,这应该很快Plyr

我有很多组(公司,作为数据集中的一个因素),我想完全删除所有value在该公司的任何单元格中显示为 0 条目的公司。因此,我创建了一个新的但在某些时候data.frame忽略了所有显示 0 的组。value

for循环:

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 建议的数据创建。本,非常感谢。此外,我的代码已更改,以符合下面提供的答案。

4

1 回答 1

5

.fun您可以为以下参数提供匿名函数ddply()

set.seed(1)

mydf <- data.frame(firmname = sample(LETTERS[1:5], 40, replace = TRUE),
  value = rpois(40, 2))

library(plyr)

ddply(mydf,.(firmname), function(x) if(any(x$value==0)) NULL else x )

或使用[,如 Andrie 建议的那样:

firms0 <- unique(mydf$firmname[which(mydf$value == 0)])

mydf[-which(mydf$firmname %in% firms0), ]

请注意,结果ddply是根据排序的firmname

编辑

对于您评论中的示例,这种方法再次比使用ddply()子集更快,只选择具有三个以上条目的公司:

firmTable <- table(mydf$firmname)

firmsGT3 <- names(firmTable)[firmTable > 3]

mydf[mydf$firmname %in% firmsGT3, ]
于 2012-04-27T12:02:53.643 回答