2012-04-27 73 views
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所建議的數據創建。本,非常感謝。此外,我的代碼被修改以符合下面提供的答案。

+0

你沒有提供的樣本數據,但是這聽起來像使用'['操作符的標準子集。 – Andrie 2012-04-27 11:27:16

+0

@Andrie聽起來對我來說,他想讓所有條目滿足某些條件的組中的所有條目。所以'plyr'或'by'似乎更容易。 Jan,請閱讀本文,因爲它會幫助我們解決您的問題:http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – 2012-04-27 12:03:15

+0

非常感謝您的答案!我編輯了這篇文章,並添加了Ben所建議的數據複製(見下文)。 – Jan 2012-04-30 13:20:04

回答

5

你可以在ddply()提供一個匿名函數的.fun說法:

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, ] 
+0

嘿,本,謝謝你這些偉大的答案!這正是我所期待的。我不知道如何在整個組上應用第二版([操作])。正如上面的註釋中所寫,[操作比Plyr或for循環要快得多。 – Jan 2012-04-30 13:25:39

+0

第二個答案在調節單個單元格值時效果很好。在調整行數時它也可以工作嗎?我嘗試過Plyr:'mydf < - ddply(mydf,。(firmname),function(x)if(length(x $ firmname <3))NULL else x)'和其他'''方法的其他方法'讓它工作。 – Jan 2012-04-30 17:13:18

+0

我得到它的工作! 'ddply(mydf,。(firmname),function(x)if(length(x $ firmname)> 3)NULL else x)'正在完成這項工作。這將選擇所有具有3個以上觀察值的組(公司)。用'<'這個數據被整理出來。我想這只是一個''''太多了。 – Jan 2012-04-30 17:43:39