2016-04-05 4 views
1

私はRで自分のデータフレームを整形するのにいくつかの困難を抱えています。A、B、C、D、Eという5人の個人がいます。観測:X、Y、およびZ。データフレームを長い形式から広い形式に変換して、1つの行を1つの行に、X、Y、Zという2つの列を生成したいと考えています。、 Xの最大値を持つ観測値の集合が最初に現れるようなXの値。したがって、所与の観察のために、X、Y、及びZの値は、一緒にグループ化されたままでなければならないが、観察1又は2の値を表示するかどうかは、最初れた以下Rでデータフレームを再形成する方法は、最大値を条件としていますか?

df = data.frame(
    indiv = c("A","A","B","C","C","D","D","E"), 
    observ = c(1,2,1,1,2,1,2,1), 
    X = c(rnorm(8, mean = 10, sd = 6)), 
    Y = c(rnorm(8, mean = 0, sd = 2)), 
    Z = c(rnorm(8, mean = 4, sd = 4)) 
) 

     indiv observ X Y Z 
1 A 1 9.959043 1.785043 10.134511 
2 A 2 14.122006 -2.257666 5.799366 
3 B 1 11.562801 -1.394951 4.988923 
4 C 1 12.955644 -4.330272 8.870165 
5 C 2 13.582154 -1.727224 -7.5617 
6 D 1 4.053437 1.815233 1.789157 
7 D 2 12.990071 -1.989307 3.67696 
8 E 1 2.820895 -3.754263 3.001725 

Xの最大値を有する依存します私のワイドデータフレームがどのように見えているかです。個々のAについては、Xは観測2でより大きく、値の集合(X、Y、Z)が最初に現れる。対照的に、個体CおよびDについては、Xは観察1においてより大きかったので、セットが最初に現れる。私はそれが変形機能のいくつかのバリエーションでなければならないと思うが、私はXの最大値を条件付けする方法がわからない。事前に感謝!

 indiv observ X Y Z observ X Y Z 
1 A 2 18.797087 0.3247862 4.774446 1 8.547868 0.3203667 6.729975 
2 B 1 1.646638 0.7986036 6.938825 NA NA NA NA 
3 C 1 17.354905 -2.399272 8.357045 2 6.856093 0.6493722 2.420827 
4 D 1 16.058101 -1.2370024 4.045489 2 7.641576 3.0820116 4.232615 
5 E 1 13.625998 -0.1953445 -5.627932 NA NA NA NA 
+2

転記する前に 'set.seed'を再現できるようにしてください。 – bouncyball

答えて

1

私はキャストする前に注文します。以下の用途data.table dcast機能は同様にそのパッケージ内にあるように - 通常のdata.frameで行われ、今通常キャストreshape同様

library(data.table) 
set.seed(1) 
df = data.frame(
    indiv = c("A","A","B","C","C","D","D","E"), 
    observ = c(1,2,1,1,2,1,2,1), 
    X = c(rnorm(8, mean = 10, sd = 6)), 
    Y = c(rnorm(8, mean = 0, sd = 2)), 
    Z = c(rnorm(8, mean = 4, sd = 4)) 
) 
df 
    indiv observ   X   Y   Z 
1:  A  2 11.101860 -0.61077677 7.775345 
2:  A  1 6.241277 1.15156270 3.935239 
3:  B  1 4.986228 3.02356234 7.284885 
4:  C  1 19.571685 0.77968647 6.375605 
5:  C  2 11.977047 -1.24248116 7.675909 
6:  D  2 12.924574 2.24986184 4.298260 
7:  D  1 5.077190 -4.42939977 7.128545 
8:  E  1 14.429948 -0.08986722 -3.957407 

setDT(df) 
df <- df[order(indiv,-X)] #orders your frame 
df[, observ := as.numeric(1:.N), by = indiv] #reset observ based on new order 

df 
    indiv observ   X   Y   Z 
1:  A  1 11.101860 -0.61077677 7.775345 
2:  A  2 6.241277 1.15156270 3.935239 
3:  B  1 4.986228 3.02356234 7.284885 
4:  C  1 19.571685 0.77968647 6.375605 
5:  C  2 11.977047 -1.24248116 7.675909 
6:  D  1 12.924574 2.24986184 4.298260 
7:  D  2 5.077190 -4.42939977 7.128545 
8:  E  1 14.429948 -0.08986722 -3.957407 

することができます

dcast(df, indiv ~ observ, value.var = c("X","Y","Z")) 

    indiv  X_1  X_2   Y_1  Y_2  Z_1  Z_2 
1:  A 11.101860 6.241277 -0.61077677 1.151563 7.775345 3.935239 
2:  B 4.986228  NA 3.02356234  NA 7.284885  NA 
3:  C 19.571685 11.977047 0.77968647 -1.242481 6.375605 7.675909 
4:  D 12.924574 5.077190 2.24986184 -4.429400 4.298260 7.128545 
5:  E 14.429948  NA -0.08986722  NA -3.957407  NA 

列を取得するには私はあなたが溶けてからキャストする必要があると思います:

dcast(melt(df, id.vars = c("indiv","observ")), indiv ~ observ + variable) 
    indiv  1_X   1_Y  1_Z  2_X  2_Y  2_Z 
1:  A 11.101860 -0.61077677 7.775345 6.241277 1.151563 3.935239 
2:  B 4.986228 3.02356234 7.284885  NA  NA  NA 
3:  C 19.571685 0.77968647 6.375605 11.977047 -1.242481 7.675909 
4:  D 12.924574 2.24986184 4.298260 5.077190 -4.429400 7.128545 
5:  E 14.429948 -0.08986722 -3.957407  NA  NA  NA 
+0

優秀、ありがとうございました! –

関連する問題