2017-06-21 12 views
2

3列と4行の2つのデータがあります。私がする必要があるのは、df1のいくつかの要素を同じ場所のdf2の値に置き換えることです。置き換える必要がある要素が同じ列にある場合、このジョブは簡単に実行されます。しかし、私の問題は彼らが異なるコラムにあることです。私は、どの列を置き換えなければならないという情報を持つ行列(ここではinfo)を持っています。以下は例です。 infoは、最初の3行については1番目と3番目の列を変更する必要があり、最後の行では2番目と3番目の列を変更する必要があることを示しています。 R:列の位置情報を指定すると、異なる列のデータ要素を置き換えます。

set.seed(1) 
df1 <-matrix(sample(1:1000, 12, replace=T), ncol=3) 
df2 <-round(matrix(runif(12, 0.1, 0.9),ncol=3),1) 
info<-matrix(rep(1:3, 4),ncol=3, byrow=T) 
info<-t(apply(info, 1, function(x) sort(sample(x, 2, replace=F)))) 

> df1 
    [,1] [,2] [,3] 
[1,] 266 202 630 
[2,] 373 899 62 
[3,] 573 945 206 
[4,] 909 661 177 
> df2 
    [,1] [,2] [,3] 
[1,] 0.6 0.7 0.8 
[2,] 0.4 0.9 0.3 
[3,] 0.7 0.4 0.6 
[4,] 0.5 0.7 0.2 
> info 
    [,1] [,2] 
[1,] 1 3 
[2,] 1 3 
[3,] 1 3 
[4,] 2 3 

この例から、私がどのように見える結果を取得したい

 [,1] [,2] [,3] 
[1,] 0.6 202 0.8 
[2,] 0.4 899 0.3 
[3,] 0.7 945 0.6 
[4,] 909 0.7 0.2 

すべてのヘルプは本当にいただければ幸いです。ありがとう。

答えて

2

infoに、更新する行列エントリを含めるように構成します。以下は、info行列を適切なインデックス行列に変換します。

set.seed(1) 
df1 <-matrix(sample(1:1000, 12, replace=T), ncol=3) 
df2 <-round(matrix(runif(12, 0.1, 0.9),ncol=3),1) 
info<-matrix(rep(1:3, 4),ncol=3, byrow=T) 
info<-t(apply(info, 1, function(x) sort(sample(x, 2, replace=F)))) 

# Convert info to a index matrix 
info_new <- cbind(rep(seq_len(nrow(info)), ncol(info)), c(info)) 
print(info_new) 
#  [,1] [,2] 
#[1,] 1 1 
#[2,] 2 1 <- row 2, col 1 
#[3,] 3 1 
#[4,] 4 2 
#[5,] 1 3 
#[6,] 2 3 
#[7,] 3 3 <- row 3, col 3 
#[8,] 4 3 etc 

df1[info_new] <- df2[info_new] 
print(df1) 
#  [,1] [,2] [,3] 
#[1,] 0.6 202.0 0.8 
#[2,] 0.4 899.0 0.3 
#[3,] 0.7 945.0 0.6 
#[4,] 909.0 0.7 0.2 
0

df1の行をループ:

for (i in 1:nrow(df1)) df1[i,info[i,]]<-df2[i,info[i,]] 
df1 
     [,1] [,2] [,3] 
[1,] 0.6 202.0 0.8 
[2,] 0.4 899.0 0.3 
[3,] 0.7 945.0 0.6 
[4,] 909.0 0.7 0.2 
関連する問題