2016-05-06 5 views
0

私が書いたプログラムを変更しています。当初、このプログラムは、一定の6要素を有する「nS」ベクトルのデータを分析するように設計されていた。今度は、プログラムが1から100までの動的要素を持つnSベクターを扱うようにします。r - ここでループするのを避けるには?

「#他の必要状態」(理想的にはループを使用しないで適用機能を使用する)でセクションを再設計する方法はありますか?

# calculate dominant package size for each needstate 
package <- as.factor(levels(df$Bagtype)) # name vector with package names 
qoo <- data.frame(lapply(package, function(x) sum(df$Nettoerloes[df$NeedState == nS[1] & df$Bagtype == package[x]], na.rm = T))) # first need state + create data frame 
names(qoo) <- package # name columns 

# other need states 

qoo[2,] <- lapply(package, function(x) sum(df$Nettoerloes[df$NeedState == nS[2] & df$Bagtype == package[x]], na.rm = T)) 
qoo[3,] <- lapply(package, function(x) sum(df$Nettoerloes[df$NeedState == nS[3] & df$Bagtype == package[x]], na.rm = T)) 
qoo[4,] <- lapply(package, function(x) sum(df$Nettoerloes[df$NeedState == nS[4] & df$Bagtype == package[x]], na.rm = T)) 
qoo[5,] <- lapply(package, function(x) sum(df$Nettoerloes[df$NeedState == nS[5] & df$Bagtype == package[x]], na.rm = T)) 
qoo[6,] <- lapply(package, function(x) sum(df$Nettoerloes[df$NeedState == nS[6] & df$Bagtype == package[x]], na.rm = T)) 

row.names(qoo) <- nS #name rows 

答えて

3

私がこの問題を解決するために見ることができる最も効率的な方法は、tapplyを使用することです。

まず、df $ NeedStateにnSの数が含まれていないすべての行をデータセットから削除します。

df2<-df[!(df$NeedState %in% nS),] 

その後、我々は合計を実行するtapply使用することができます。

qoo<-tapply(df2$Nettoerloes, list(df2$NeedState,df2$Bagtype), sum) 

tapplyは、リスト内の変数の組み合わせ毎に、この場合の合計で、それは与えられた機能を実行します()。

nSに含まれる状態の数に関係なく動作するはずです。

関連する問題