根据两个数据框中的列有条件地替换值

Condtional replacement of values based on columns in two dataframes

我下面有两个数据框,它们的列名相同。我想将 df_B 中基于敌人的值更改为 NA df_A 中的每个“1”。请参阅“目标”以了解我希望实现的目标。

谢谢!

日期框架 A

 ID  x1 x2 x3
  A  NA  1 NA
  B  NA  1  1
  C  NA  1 NA
  

数据框 B

 ID x1 x2 x3
  A  0  9  0
  B  10 4  6
  C  0  5  5

目标

 ID x1 x2 x3
  A  0  NA 0
  B  10 NA NA
  C  0  NA 5

关于如何执行此操作的任何想法?我试过使用 ifelse 函数和子集无济于事。 谢谢大家!

我们通过检查元素是否等于 1,用第一列以外的第一个数据创建一个逻辑矩阵。使用它来对没有第一列的 df2 中的值进行子集化,并将它们分配给 NA

df2[-1][(df1[-1] == 1) & !is.na(df1[-1])] <- NA

由于 'df1' 中有 NA 个元素,我们可以使用 is.na 来检查不是 NA 且为 1

的元素

-输出

df2
#  ID x1 x2 x3
#1  A  0 NA  0
#2  B 10 NA NA
#3  C  0 NA  5

数据

df1 <- structure(list(ID = c("A", "B", "C"), x1 = c(NA, NA, NA), x2 = c(1L, 
1L, 1L), x3 = c(NA, 1L, NA)), class = "data.frame", row.names = c(NA, 
-3L))

df2 <- structure(list(ID = c("A", "B", "C"), x1 = c(0L, 10L, 0L), x2 = c(9L, 
4L, 5L), x3 = c(0L, 6L, 5L)), class = "data.frame", row.names = c(NA, 
-3L))