将data.frame行中的值替换为对应的行a vector

时间:2017-06-10 10:28:04

标签: r matrix dataframe replace

我想替换一行data.frame的每个值,因为等大小的逻辑矩阵的值为TRUE,取值为向量的相应行的值。 这是一个例子:

> df1
     [,1] [,2] [,3] [,4]
[1,]    2    8    9    4
[2,]    2    6    6    6
[3,]    4    9    4    8

> a
     [,1]  [,2]  [,3]  [,4]
[1,] TRUE FALSE FALSE  TRUE
[2,] TRUE FALSE FALSE FALSE
[3,] TRUE FALSE  TRUE FALSE

> df2
[1] 5 4 6

所以结果应该是这样的:

> df1
     [,1] [,2] [,3] [,4]
[1,]    5    8    9    5
[2,]    4    6    6    6
[3,]    6    9    6    8

有没有办法在不使用循环的情况下执行此操作? 感谢

2 个答案:

答案 0 :(得分:2)

您需要一些高级子集:

df1[a] <- df2[row(a)[a]]

输出:

> df1
  V1 V2 V3 V4
1  5  8  9  5
2  4  6  6  6
3  6  9  6  8

此解决方案适用于数据框或矩阵。

答案 1 :(得分:1)

我们复制&#39; df2&#39;由row的&#39; a&#39;或者&#39; df1&#39;,基于&#39; a&#39;的逻辑矩阵,我们更改值

ifelse(a, df2[row(a)], df1)
#     [,1] [,2] [,3] [,4]
#[1,]    5    8    9    5
#[2,]    4    6    6    6
#[3,]    6    9    6    8

如果是data.frame,那么我们只需更改as.matrix(df1),它应该适用于两种情况

df1[] <- ifelse(a, df2[row(a)], as.matrix(df1))

或另一种选择是

(df1*!a) + (df2[row(a)]*a)
#     [,1] [,2] [,3] [,4]
#[1,]    5    8    9    5
#[2,]    4    6    6    6
#[3,]    6    9    6    8

注意:输出均为matrix,如预期输出中所示,OP示例中的初始数据集为matrix。但它适用于data.framematrix(带编辑)