0

データフレームを次々に追加して別のデータフレームを形成するにはどうすればよいですか?データフレームを含めるかどうかは、基準によって決定されます。

データの例を次に示します。

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

さて、変数MyIntの平均が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)私の問題の解決策を教えてくれることを感謝します。

4

2 に答える 2

1

私があなたの質問を正しく理解していれば、グループごとに平均を計算し、特定のしきい値を満たすものだけを既存のファイルに書き込む必要があります。もしそうなら、一度にすべての平均を計算し、それをサブセット化してから書き出してみませんか? おそらく複数に分割する必要がある1つのライナーを次に示しますが、ポイントを理解できると思います。

write.table(
  subset(
    ddply(d1, "MyGroups", transform, meanval = mean(MyInt)
          ), 
    meanval > 10), 
  "yourcsv.csv", append = TRUE, sep = ",", col.names = FALSE
  )
于 2012-05-25T17:59:35.910 に答える
1

あなたが作っているよりも簡単です。によって呼び出される関数はddply、基準が満たされている場合はデータのサブセットを返し、そうでない場合は空の data.frame を返すことができます。

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

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

内部のテストが間違っていたことに注意してください(値keepGrpの平均をテストしていませんでした)。MyIntddplyMyGroupsMyInt

これが正しいことの確認:

> 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

于 2012-05-25T18:34:07.190 に答える