2012-05-25 55 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的分組錯誤** –