1

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

  inten      new.probes
  12.28280      AFFX-r2-P1-cre-5_at
  12.35039      AFFX-r2-P1-cre-5_at
  12.38397      AFFX-r2-P1-cre-5_at
  12.36304      AFFX-r2-P1-cre-5_at
  12.16271      AFFX-r2-P1-cre-5_at
  12.70304      AFFX-r2-P1-cre-3_at
  12.28280      AFFX-r2-P1-cre-3_at
  12.35039      AFFX-r2-P1-cre-3_at
  12.38397      AFFX-r2-P1-cre-3_at
  12.36304      AFFX-r2-P1-cre-3_at
  12.16271      AFFX-r2-P1-cre-2_at
  12.70304      AFFX-r2-P1-cre-2_at 
  12.16271      AFFX-r2-P1-cre-2_at
  12.70304      AFFX-r2-P1-cre-2_at

(上記は、プローブ名を 1 つの列として、シグナル強度値をもう 1 つの列として持つ 2 つの別個の列としての形式です) そして、データ フレームを次の方法で変換したいと考えています。

AFFX-r2-P1-cre-5_at 12.28280 12.35039  12.38397  12.36304   12.16271 
AFFX-r2-P1-cre-3_at 12.28280 12.35039  12.38397  12.36304   12.16271 
AFFX-r2-P1-cre-2_at 12.38304 12.36304  12.38397  12.16271   12.70304

どんな提案でも大歓迎です。これは大きなデータセットであり、私はその一部のみを支援のために提供しました。

4

2 に答える 2

3

の値に同じ数の要素がある場合はnew.probes、次を使用できます。

do.call(rbind, unstack(dat))
                        [,1]     [,2]     [,3]     [,4]     [,5]
AFFX-r2-P1-cre-2_at 12.16271 12.70304 12.16271 12.70304 12.16271
AFFX-r2-P1-cre-3_at 12.70304 12.28280 12.35039 12.38397 12.36304
AFFX-r2-P1-cre-5_at 12.28280 12.35039 12.38397 12.36304 12.16271
Warning message:
In function (..., deparse.level = 1)  :
  number of columns of result is not a multiple of vector length (arg 1)

しかし、これは明らかに間違っています-短いベクトルをNA:で埋める必要があります

x <- unstack(dat)
m <- max(sapply(x, length))
do.call(rbind, lapply(x, function(x)c(x, rep(NA, m-length(x)))))

                        [,1]     [,2]     [,3]     [,4]     [,5]
AFFX-r2-P1-cre-2_at 12.16271 12.70304 12.16271 12.70304       NA
AFFX-r2-P1-cre-3_at 12.70304 12.28280 12.35039 12.38397 12.36304
AFFX-r2-P1-cre-5_at 12.28280 12.35039 12.38397 12.36304 12.16271
于 2012-08-13T13:48:57.223 に答える
1

これが私がこの問題に取り組む方法です:

  1. new.probes変数がソートされていることを確認してください。
  2. sequence()とを使用しrle()て、それぞれの「時間」変数を生成しますnew.probes
  3. reshape()データの変換に使用します。

サンプル データを使用した実際の例を次に示します (名前が「DF」であると仮定します)。

DF = DF[order(DF$new.probes), ]
DF$time = sequence(rle(as.vector(DF$new.probes))$lengths)
reshape(DF, direction = "wide", idvar = "new.probes", timevar = "time")
#             new.probes  inten.1  inten.2  inten.3  inten.4  inten.5
# 11 AFFX-r2-P1-cre-2_at 12.16271 12.70304 12.16271 12.70304       NA
# 6  AFFX-r2-P1-cre-3_at 12.70304 12.28280 12.35039 12.38397 12.36304
# 1  AFFX-r2-P1-cre-5_at 12.28280 12.35039 12.38397 12.36304 12.16271

reshape2または、基本 R の構文を使用する場合は、reshape手順 3 を次のように置き換えます。

require(reshape2)
dcast(DF, new.probes ~ time, value.var = "inten")
于 2012-08-13T17:00:19.823 に答える