我想替换一行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
有没有办法在不使用循环的情况下执行此操作? 感谢
答案 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.frame
和matrix
(带编辑)