根据另一个数据帧中第一次出现vale,用NA替换数据帧行中的剩余值 数据

问题描述

我有两个数据帧,其中一个具有数字行并代表一个时间序列的行的子集,另一个是与初始数据帧中的时间点有关的1和0的数据帧。 / p>

基于布尔数据帧,我想在布尔数据帧中首次出现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'(matrix)创建逻辑df2 == 0,然后使用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","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,0L),t2 = c(1L,0L,t3 = c(1L,1L)),-5L))