2014-10-02 91 views
0

我正在處理名爲「all」的產品的data.frame,其第一個變量all$V1是產品系列。每個產品系列有幾行,即length(levels(all$V1)) < length(all$V1)R - 在循環還是向量中遍歷data.frame的級別?

我想遍歷產品系列「p」中的data.frame和process。我是R新手,所以當我可以做矢量或者循環時,我還沒有完全掌握。此刻,我可以遍歷並獲得由子組:

for (i in levels (all$V1)){ 
    p = all[which(all[,'V1'] == i), ]; 
    calculateStuff(p); 
} 

這是做到這一點的方式,或者是有與apply什麼這樣做的常規矢量方式?只有幾千行,所以性能增益可能是可以忽略不計的,但我想爲更大的數據傳輸開闢良好的習慣。

+0

查看'aggregate'。它基本上是'tapply'的包裝器,併爲data.frame的子集計算彙總統計信息。有這樣做的不同方式,「聚合」是否合適取決於你想要計算的東西。但這是一個好的開始,使用起來非常方便。 – SimonG 2014-10-02 14:43:42

+0

有十幾種方法可以做到這一點。通常你會使用實現「拆分應用組合」概念的功能。看看軟件包plyr,dplyr,data.table。 – Roland 2014-10-02 14:56:41

回答

1

數據:

all = data.frame(V1=c("a","b","c","d","d","c","c","b","a","a","a","d")) 

'全部' 可以由V1拆分:

> ll = split(all, all$V1) 
> ll 
$a 
    V1 
1 a 
9 a 
10 a 
11 a 

$b 
    V1 
2 b 
8 b 

$c 
    V1 
3 c 
6 c 
7 c 

$d 
    V1 
4 d 
5 d 
12 d 

sapply可用於分析列表 'L-L' 的每個分量。以下找到每個組件(它代表產品系列)中的行數:

calculateStuff <- function(p){ 
    nrow(p) 
} 

> sapply(ll, calculateStuff) 
a b c d 
4 2 3 3 
+0

謝謝,因爲事實證明'calculateStuff'會處理線條並計算一些基本的統計數據,然後將其全部輸出到png中。這看起來是一個更好的方法來做到這一點。 – Escher 2014-10-03 05:51:27

0

有不太可能是多與下方的性能增益,但它至少是更緊湊,並返回calculateStuff結果作爲一種方便的列表:

lapply(levels(all$V1), function(i) calculateStuff(all[all$V1 == i, ])) 

由於@SimonG他指出,根據您的calculateStuff函數的具體情況,aggregate也可能對您有用,如果您希望以數據框的形式顯示結果。