2014-10-02 137 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也可能对您有用,如果您希望以数据框的形式显示结果。