根据在另一个数据框中首次出现的值,用 NA 替换数据框行中的剩余值

Replace remaining values in a data frame row with NA based on the first occurrence of a vale in another data frame

我有两个数据框,其中一个包含数字行的子集并表示时间序列,另一个是与初始数据框中的时间点相关的 1 和 0 的数据框.

基于布尔数据帧,我想在布尔数据帧中第一次出现 0 的时间点用 NA 替换初始数据帧中的值。

示例如下:

df1

ID  category  t1   t2   t3
1      A      5    5.2  7
2      A      7    7.5  8
3      B      9    10.3 11
4      B      3    4.1  4.7
5      C      2    3    4.5


df2

t1   t2   t3
0     1   1
1     0   1
1     1   1
1     1   0
0     0   1

生成的数据框应该只是第一个数据框的修改版本,但某些值被基于 df2 的 NA 替换,如下所示

df1

ID  category  t1   t2   t3
1      A      NA   NA   NA
2      A      7    NA   NA
3      B      9    10.3 11
4      B      3    4.1  NA
5      C      NA   NA   NA

我正在努力寻找在 R 中执行此操作的非常有效的方法

带有 rowCumsums 的选项。从'df2'(df2 == 0)创建一个逻辑matrix,然后用rowCumsums求出每行的累加和,改成逻辑矩阵( > 0)并将 'df1' 中对应的元素替换为 NA

library(matrixStats)
df1[names(df2)] <- df1[names(df2)] *NA^(rowCumsums(df2 == 0) > 0)

也可以写成

df1[names(df2)][rowCumsums(df2 == 0) > 0] <- NA

-输出

df1
#  ID category t1   t2 t3
#1  1        A NA   NA NA
#2  2        A  7   NA NA
#3  3        B  9 10.3 11
#4  4        B  3  4.1 NA
#5  5        C NA   NA NA

数据

df1 <- structure(list(ID = 1:5, category = c("A", "A", "B", "B", "C"
), t1 = c(5L, 7L, 9L, 3L, 2L), t2 = c(5.2, 7.5, 10.3, 4.1, 3), 
    t3 = c(7, 8, 11, 4.7, 4.5)), class = "data.frame", row.names = c(NA, 
-5L))

df2 <- structure(list(t1 = c(0L, 1L, 1L, 1L, 0L), t2 = c(1L, 0L, 1L, 
1L, 0L), t3 = c(1L, 1L, 1L, 0L, 1L)), class = "data.frame", 
row.names = c(NA, 
-5L))