2012-05-25 53 views
0

如何依次追加数据帧来形成另一个数据帧? 数据框是否将被包含将由一个标准决定。基于R中的函数追加数据帧

下面是一个例子数据:

d1 <- data.frame(MyGroups =sample(LETTERS,100,replace=TRUE), 
       MyInt = sample(c(1:20),100,replace=TRUE)) 

现在,我应该如何选择由具有平均可变敏的大于10 MyGroups组(A,B,C ...)?

我试过以下没有成功。在这里,我将数据框添加到基于给定条件的文件中。

require("plyr") 

keepGrp <- function(df0) { 
    if(max(df0$MyInt < 10)) {df0 <- NULL} 
    write.csv(df0,'mytable.txt',append=TRUE,sep=',') 
} 

ddply(d1,.(MyInt),function(x) keepGrp(x)) 

所需的数据帧应该在文件mytable.txt 我完全肯定有一个更好的办法做到我想做的事情。 如果我需要这样做,我会很乐意澄清我的问题。 我会欣赏有人可以(1)向我展示改进我的编程思想的反馈(2)给我一个解决我的问题的方法。

+0

您的目标是创建一个data.frame或创建一个文件?你提出的问题首先是询问一个data.frame,但最后是询问一个文件。 –

+0

你检查过'rbind'吗? – betabandido

+0

我想要一个数据框,但不知道该怎么做。我唯一能想到的就是使用ddply并将结果发送到文件,然后从该文件导入数据帧 –

回答

1

如果我正确理解您的问题,您希望按组计算平均值,并只将符合某个阈值的那些写入预先存在的文件。如果是这样,为什么不一次计算所有的手段,子集,然后写出来呢?这里有一个内衬也许应该分成多次,但我想你会明白了吧:

write.table(
    subset(
    ddply(d1, "MyGroups", transform, meanval = mean(MyInt) 
     ), 
    meanval > 10), 
    "yourcsv.csv", append = TRUE, sep = ",", col.names = FALSE 
) 
+0

因此,总结:使用'transform'创建一个列,然后使用'subset'对数据行进行过滤[ –

1

这是简单的比你做它。 ddply调用的函数可以返回符合条件的数据子集,如果不符合则返回空数据。

keepGrp <- function(df0) { 
    if(mean(df0$MyInt) > 10) { 
    df0 
    } else { 
    data.frame() 
    } 
} 

res <- ddply(d1, .(MyGroups), keepGrp) 

注意,里面keepGrp你的测试是错误的(没有测试MyInt值的平均值)和ddply的分组是错误的(应该是MyGroups,不MyInt)。

检查,这是正确的:

> ddply(d1, .(MyGroups), summarise, ave = mean(MyInt)) 
    MyGroups  ave 
1   A 14.200000 
2   B 9.600000 
3   C 5.600000 
4   D 5.600000 
5   E 8.000000 
6   F 10.500000 
7   G 7.333333 
8   H 12.000000 
9   I 7.333333 
10  J 9.500000 
11  K 11.000000 
12  L 12.375000 
13  M 13.250000 
14  N 12.000000 
15  O 11.666667 
16  P 8.625000 
17  Q 13.000000 
18  R 6.000000 
19  S 16.000000 
20  T 12.000000 
21  U 12.000000 
22  V 13.250000 
23  W 17.666667 
24  X 9.000000 
25  Y 12.400000 
26  Z 13.750000 
> unique(res$MyGroup) 
[1] A F H K L M N O Q S T U V W Y Z 
Levels: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 

所以出现在res了的是那些有MyInt适当的平均值。

+0

+1(针对data.frame()),并指出ddply的分组错误** –