17

大きなデータフレームを再形成する際に問題が発生しています。そして、私は過去に再形成の問題を避けることができたのは比較的幸運でした。

現在のデータフレームは次のようになります。

unique_id    seq   response    detailed.name    treatment 
a            N1     123.23     descr. of N1     T1
a            N2     231.12     descr. of N2     T1
a            N3     231.23     descr. of N3     T1
...
b            N1     343.23     descr. of N1     T2
b            N2     281.13     descr. of N2     T2
b            N3     901.23     descr. of N3     T2
...

そして、私はしたい:

seq    detailed.name   T1           T2
N1     descr. of N1    123.23       343.23
N2     descr. of N2    231.12       281.13
N3     descr. of N3    231.23       901.23

reshape パッケージを調べましたが、処理因子を個々の列名に変換する方法がわかりません。

ありがとう!

編集:ローカルマシン(4GBデュアルコアiMac 3.06Ghz)でこれを実行しようとしましたが、次のように失敗し続けます:

> d.tmp.2 <- cast(d.tmp, `SEQ_ID` + `GENE_INFO` ~ treatments)
Aggregation requires fun.aggregate: length used as default
R(5751) malloc: *** mmap(size=647168) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug

機会があれば、これをより大きなマシンの 1 つで実行してみます。

4

5 に答える 5

21

形を変えることは私にとっても常に難しいように思えますが、それは常に少しの試行錯誤でうまくいくようです。これが私が見つけたものです:

> x
  unique_id seq response detailed.name treatment
1         a  N1   123.23           dN1        T1
2         a  N2   231.12           dN2        T1
3         a  N3   231.23           dN3        T1
4         b  N1   343.23           dN1        T2
5         b  N2   281.13           dN2        T2
6         b  N3   901.23           dN3        T2

> x2 <- melt(x, c("seq", "detailed.name", "treatment"), "response")
> x2
  seq detailed.name treatment variable  value
1  N1           dN1        T1 response 123.23
2  N2           dN2        T1 response 231.12
3  N3           dN3        T1 response 231.23
4  N1           dN1        T2 response 343.23
5  N2           dN2        T2 response 281.13
6  N3           dN3        T2 response 901.23

> cast(x2, seq + detailed.name ~ treatment)
  seq detailed.name     T1     T2
1  N1           dN1 123.23 343.23
2  N2           dN2 231.12 281.13
3  N3           dN3 231.23 901.23

元のデータはすでに長い形式でしたが、メルト/キャストが使用する長い形式ではありませんでした。それで私はそれを再溶解しました。2番目の引数(id.vars)は、溶けないもののリストです。3番目の引数(measure.vars)は、変化するもののリストです。

次に、キャストは式を使用します。チルダの左側はそのままの状態であり、チルダの右側は値の列を調整するために使用される列です。

多かれ少なかれ...!

于 2009-10-07T19:11:41.343 に答える
6

ハーランの答えに基づいて構築 - データがすでに長い形式であり、値を保持する列がcast呼び出しで指定されている場合、再溶解ステップを回避できます。

> x <- read.table(textConnection("  unique_id seq response detailed.name treatment
+ 1         a  N1   123.23           dN1        T1
+ 2         a  N2   231.12           dN2        T1
+ 3         a  N3   231.23           dN3        T1
+ 4         b  N1   343.23           dN1        T2
+ 5         b  N2   281.13           dN2        T2
+ 6         b  N3   901.23           dN3        T2"))
> 
> cast(x, seq + detailed.name ~ treatment, value = "response")
  seq detailed.name     T1     T2
1  N1           dN1 123.23 343.23
2  N2           dN2 231.12 281.13
3  N3           dN3 231.23 901.23
于 2009-10-07T22:21:31.497 に答える
2

パッケージreshape内の関数を使用することもできます。statsサンプル データセットはありませんが、次のようになります。

reshape(x, idvar=c("seq","detailed.name"), timevar="treatment", direction="wide")
于 2009-10-07T19:55:30.460 に答える
1

を使用して同じ結果を得たい場合reshape2は、より高速でメモリ効率の高いreshapeパッケージの書き換えが可能であり、次のようにします。

主な変更点は、出力として使用したいdcast場合に関数を使用することです。これはの機能を置き換えますcastdata.framecastreshape

library(reshape2)

x = read.table(text = "unique_id seq   response  detailed.name treatment
                           a      N1    123.23         dN1        T1
                           a      N2    231.12         dN2        T1
                           a      N3    231.23         dN3        T1
                           b      N1    343.23         dN1        T2
                           b      N2    281.13         dN2        T2
                           b      N3    901.23         dN3        T2", 
sep = "", header = TRUE)

x

y <- dcast(x, seq + detailed.name ~ treatment, value.var = "response")
y
#   seq detailed.name     T1     T2
# 1  N1           dN1 123.23 343.23
# 2  N2           dN2 231.12 281.13
# 3  N3           dN3 231.23 901.23

# EDIT to show how to return to the original data set:

melt(y, id.vars=c('seq', 'detailed.name'), variable.name='T', value.name='response')

#   seq detailed.name  T response
# 1  N1           dN1 T1   123.23
# 2  N2           dN2 T1   231.12
# 3  N3           dN3 T1   231.23
# 4  N1           dN1 T2   343.23
# 5  N2           dN2 T2   281.13
# 6  N3           dN3 T2   901.23
于 2012-11-27T22:31:14.897 に答える