按条件子集数据

Jan*_*Jan 2 split r subset plyr

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

我有很多团体(公司,作为数据集中的一个因素),我想完全放弃每个公司,value在该公司的任何一个单元格中显示0条目.因此我创建了一个新的,data.frame但遗漏了所有value在某个时刻显示0的组.

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)
Run Code Online (Sandbox Code Playgroud)

有没有办法实现plyr包裹?该subset功能可以在该环境中使用吗?

编辑:为了复制问题,增加了BenBarnes建议的数据创建.本,非常感谢你.此外,我的代码被更改,以符合下面提供的答案.

Ben*_*nes 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 )
Run Code Online (Sandbox Code Playgroud)

或者[按照Andrie的建议使用:

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

mydf[-which(mydf$firmname %in% firms0), ]
Run Code Online (Sandbox Code Playgroud)

请注意,结果ddply按照排序firmname

编辑

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

firmTable <- table(mydf$firmname)

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

mydf[mydf$firmname %in% firmsGT3, ]
Run Code Online (Sandbox Code Playgroud)