问题描述
我有两个数据帧,其中一个具有数字行并代表一个时间序列的行的子集,另一个是与初始数据帧中的时间点有关的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))