2017-06-21 21 views
2

我有两列数据,包含3列和4行。我需要做的是用df2中的值替换df1中的某些元素。如果需要替换的元素在同一列中,这项工作将很容易完成。但是,我的问题是他们在不同的列。我有一个矩阵(这里是info),其中提供了应该替换哪个列的信息。下面是一个例子。 info表示前三行需要更改第一列和第三列,最后一行需要更改第二列和第三列。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列A环:

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