1

私の最初の投稿で、私は R に非常に慣れていないので、これはロブかもしれません。私は解決策を探していたので、ついに助けを求めて投稿しました。明確にする必要があるか、詳細情報を提供する必要がある場合はお知らせください。

次のような大きなデータフレームがあります。

numReads length    name2
0        7384      Ssxb2
7904     93237     St5
3438     12969     Taf9b
0        996       Tas2r138
0        882       Tas2r143
0        960       Tas2r144
0        6761      Tbx10
8125     43804     Tdrd1
8124     43738     Tdrd1
8102     39301     Tdrd1
1227     9286      Thnsl1

3 番目の列 (name2) でデータをグループ化し、max()numReads の値を見つけ、関連する長さの値を維持するにはどうすればよいですか?

私の理想的な出力は、その因子レベルの最大値を含まない「Tdrd1」に関連付けられた2行(8124および8102値の行)を持つ上記のデータです。

tapply()、、、by()およびを試しaggregate()ました。それらのどれも私に適切な出力を提供できません。

前もって感謝します。

予想よりもはるかに早く来たコメントの後に編集します。ありがとうございました!

理想的な結果の例は次のようになります

numReads  length  name2
0        7384      Ssxb2
7904     93237     St5
3438     12969     Taf9b
0        996       Tas2r138
0        882       Tas2r143
0        960       Tas2r144
0        6761      Tbx10
8125     43804     Tdrd1
1227     9286      Thnsl1

ここで2つの質問があるようです。1 つ目は、要因に基づいてデータをグループ化することです。2 つ目は、グループの関数を計算する方法ですが、選択した関数を計算した後に行全体を出力する方法です。

私は、aggregate() の後に merge() というアイデアが好きです。しかし、merge() 関数は、元の行のどの行から、共通因子レベルに基づいて「長さ」の値を取得するかをどのように知るのでしょうか?

データは、トランスクリプトの注釈に基づく遺伝子発現データのスナップショットです。関連する 'name2' について、最高の表現 (numReads に関して) のトランスクリプトを選択しようとしています。ダウンストリームの正規化のために長さのデータが必要です。

ROLOによる非常に役立つ提案を使用しようとした後、編集してください。再度、感謝します!

Chase と daroczig にも感謝します。

そのため、ddply() アプローチを使用してデータフレームを「name2」で分割し、読み取り数で降順で並べ替え、一番上の行を選択しようとしています。これにより、各グループの「name2」の最大値が効果的に得られ、すべての元の情報、特に長さが維持されます。

残念ながら、34,000 行を超えるデータフレームでこれを実行しようとしています。〜1000行、さらに〜5000行でも問題なく動作しますが、データセット全体を渡すとクラッシュします。

.parallel オプションを使用しようとしましたが、次のエラーで失敗します:

Loading required package: foreach
Error: foreach package required for parallel plyr operation

また、 .progressbar オプションを使用して操作を監視しようとしました。進行状況バーは 100% になりますが、操作は決して終了しません。

この操作を完全なデータセットに適用する方法についてのアイデアはありますか?

4

3 に答える 3

4

を使用plyrして name2 で分割し、numReads をリバース ソートして最初の行を選択します。

require(plyr)
ddply(df, "name2", function(dat) {
    dat[order(dat$numReads, decreasing=TRUE), ][1,]
})

  numReads length    name2
1        0   7384    Ssxb2
2     7904  93237      St5
3     3438  12969    Taf9b
4        0    996 Tas2r138
5        0    882 Tas2r143
6        0    960 Tas2r144
7        0   6761    Tbx10
8     8125  43804    Tdrd1
9     1227   9286   Thnsl1
于 2011-10-10T20:49:47.617 に答える
0

私はあなたが何を求めているのか正確にはわからないかもしれませんが、データベースから のレベルごとに最高値を持つ行を取得したいと思います。これは簡単に行うことができます。と後で。numReadsname2aggregatemerge

デモ データセット:

df  <- structure(list(numReads = c(0L, 7904L, 3438L, 0L, 0L, 0L, 0L, 
8125L, 8124L, 8102L, 1227L), length = c(7384L, 93237L, 12969L, 
996L, 882L, 960L, 6761L, 43804L, 43738L, 39301L, 9286L), name2 = structure(c(1L, 
2L, 3L, 4L, 5L, 6L, 7L, 8L, 8L, 8L, 9L), .Label = c("Ssxb2", 
"St5", "Taf9b", "Tas2r138", "Tas2r143", "Tas2r144", "Tbx10", 
"Tdrd1", "Thnsl1"), class = "factor")), .Names = c("numReads", 
"length", "name2"), class = "data.frame", row.names = c(NA, -11L
))

関数を使用name2してデータ フレームを集約しましょう。max

> df.a <- aggregate(numReads ~ name2, df, max)
> df.a
     name2 numReads
1    Ssxb2        0
2      St5     7904
3    Taf9b     3438
4 Tas2r138        0
5 Tas2r143        0
6 Tas2r144        0
7    Tbx10        0
8    Tdrd1     8125
9   Thnsl1     1227

の元の値をlengthデータ フレーム ( df.a)にマージします。

> merge(df.a, df)
     name2 numReads length
1    Ssxb2        0   7384
2      St5     7904  93237
3    Taf9b     3438  12969
4 Tas2r138        0    996
5 Tas2r143        0    882
6 Tas2r144        0    960
7    Tbx10        0   6761
8    Tdrd1     8125  43804
9   Thnsl1     1227   9286

あなたの質問を誤解していないことを願っています!

于 2011-10-10T19:49:50.830 に答える
0

ここには、一見 2 つの異なる質問があります。plyr最初のものはパッケージで解決できます:

library(plyr)
txt <- "numReads length    name2

0   7384    Ssxb2
7904  93237      St5
3438  12969    Taf9b
0    996 Tas2r138
0    882 Tas2r143
0    960 Tas2r144
0   6761    Tbx10
8125  43804    Tdrd1
8124  43738    Tdrd1
8102  39301    Tdrd1
1227   9286   Thnsl1
"

dat <- read.table(textConnection(txt), header = TRUE)

ddply(dat, "name2", summarize, max = max(numReads))

あなたにあげる:

     name2  max
1    Ssxb2    0
2      St5 7904
3    Taf9b 3438
4 Tas2r138    0
5 Tas2r143    0
6 Tas2r144    0
7    Tbx10    0
8    Tdrd1 8125
9   Thnsl1 1227

2 番目の質問には、次のように答えることができます。

dat[dat$name2 == "Tdrd1" & dat$numReads != max(dat$numReads[dat$name2 == "Tdrd1"]),]

   numReads length name2
9      8124  43738 Tdrd1
10     8102  39301 Tdrd1

あなたがやろうとしていることについてもう少し背景を説明してください。さらに詳しく説明します。

于 2011-10-10T19:51:22.060 に答える