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()、3 つ以上のエントリを持つ企業のみを選択して、サブセット化するよりも高速です。

firmTable <- table(mydf$firmname)

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

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