2012-08-13 12 views
1

我有一個數據幀,其看起來像這樣:如何按以下格式堆疊R中的數據?

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 

(以上是在形式與probenames爲一列和信號強度值作爲其他兩個單獨的列) 我想要的數據幀按以下方式轉換:

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 

歡迎任何建議。這是一個很大的數據集,我只給了它一小部分的幫助。

+0

你試一下?任何代碼? – dickoa 2012-08-13 13:38:01

+1

你對每個探針總是有5個值嗎? – sgibb 2012-08-13 13:38:14

回答

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 
+0

我總是有53個值和大約22800個探針 – 2012-08-13 14:12:55

+0

@DhivyaaReddy在這種情況下,'do.call(rbind,unstack(dat))'應該可以正常工作。 – Andrie 2012-08-13 14:19:24

+0

謝謝,它確實有用。 – 2012-08-13 14:23:36

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")