2016-04-04 3 views
0

特定の値を1つの行にコピーし、共通の条件に基づいて異なる行に戻したいとします。 ここで、各試行には2人の個人(被験者と敵)があり、被験者だけのために記録されたデータがあります。私は、被験者のデータを「逆転させて」適切な行、つまり被験者が相手だった場所に貼り付けたいと思います。共通のインデックスの行[i]から行[i + 1]への値の移動

例データセット:

df = data.frame(
    section = section, 
    trial = c(rep(c(rep("trial1",2), rep("trial2",2)),2)), 
    subject = rep(subjects,2), 
    rank = c(rep(c(1,4,2,3),2)), 
    count.given = rnorm(8, m=5, sd = 3), 
    opponent = rep(NA,(length(section))), 
    opponent.rank = rep(NA,(length(section))), 
    count.received = rep(NA,(length(section)))) 

ここではDFです:

section trial subject rank count.given opponent opponent.rank count.received 
1  1 trial1  a 1 11.0552711  NA   NA    NA 
2  1 trial1  b 4 4.8118577  NA   NA    NA 
3  1 trial2  c 2 8.9146090  NA   NA    NA 
4  1 trial2  d 3 11.8599362  NA   NA    NA 
5  2 trial1  a 1 0.8334179  NA   NA    NA 
6  2 trial1  b 4 4.1636337  NA   NA    NA 
7  2 trial2  c 2 4.6000360  NA   NA    NA 
8  2 trial2  d 3 6.9078512  NA   NA    NA 

は今、私の目標は、同じセクションと同じ試験の適切なデータと相手の欄に記入することです。たとえば、第1行はセクション1、試行1、およびサブジェクト "a"に対応します。相手はセクション1、試行1、そしてサブジェクト "b"です。逆もまた真です: "a"は2行目の相手です。

目標は次のようにDFを更新することです:

section trial subject rank count.given opponent opponent.rank count.received 
1  1 trial1  a 1 11.0552711  b    4  4.8118577 
2  1 trial1  b 4 4.8118577  a    1  11.0552711 
3  1 trial1  c 2 8.9146090  d    3  11.8599362 
4  1 trial1  d 3 11.8599362  c    2  8.9146090 
5  2 trial2  a 1 0.8334179  b    4  4.1636337 
6  2 trial2  b 4 4.1636337  a    1  0.8334179 
7  2 trial2  c 2 4.6000360  d    3  6.9078512 
8  2 trial2  d 3 6.9078512  c    2  4.6000360 

私はこれを行うための最善の方法は、セクションと裁判でDFをソートすること、及び、その後に対応するインデックスを作成すると思います[i]と[ i + 1]となる。次に、[i]の件名データが[i + 1]の相手データに貼り付けられ、その逆も同様です。どんな助けでも大歓迎です。

答えて

0

モジュラス演算子%%を行インデックスに使用できます。

c(1:8) %% 2 
[1] 1 0 1 0 1 0 1 0 

これはforループ内if文で使用されます:

for(i in 1:8){ 
    if(i %% 2 == 0){ 
     df[i,]$opponent = df[i-1,]$subject 
     df[i,]$opponent.rank = df[i-1,]$rank 
     df[i,]$count.received = df[i-1,]$count.given 
    }else{ 
     df[i,]$opponent = df[i+1,]$subject 
     df[i,]$opponent.rank = df[i+1,]$rank 
     df[i,]$count.received = df[i+1,]$count.given 
    } 
} 

短いバージョンは、次のようになります。

for(i in 1:nrow(df)){ 
    if(i %% 2 == 0){ 
     df[i, c(6:8)] = df[i-1, c(3:5)] 
    }else{ 
     df[i, c(6:8)] = df[i+1, c(3:5)] 
    } 
} 

PS:私は中stringsAsFactors = FALSEを設定することをお勧めしますあなたのdata.frame

関連する問題