R 根据另一数据帧中首次出现的值,将数据帧行中的剩余值替换为NA
我有两个数据帧,其中一个有数字行子集,表示时间序列,另一个是与初始数据帧中的时间点相关的1和0数据帧 基于布尔数据帧,我想在布尔数据帧中第一次出现0的时间点用NA替换初始数据帧中的值 示例如下所示:R 根据另一数据帧中首次出现的值,将数据帧行中的剩余值替换为NA,r,dataframe,apply,mapply,R,Dataframe,Apply,Mapply,我有两个数据帧,其中一个有数字行子集,表示时间序列,另一个是与初始数据帧中的时间点相关的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
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
)创建一个逻辑矩阵
),然后使用rowCumsums
获得每行的累积和,将其更改为逻辑矩阵(>0
),并将“df1”中的相应元素替换为NA
library(matrixStats)
df1[names(df2)] <- df1[names(df2)] *NA^(rowCumsums(df2 == 0) > 0)
数据
df1带有rowCumsums
的选项。从“df2”(df2==0
)创建一个逻辑矩阵
),然后使用rowCumsums
获得每行的累积和,将其更改为逻辑矩阵(>0
),并将“df1”中的相应元素替换为NA
library(matrixStats)
df1[names(df2)] <- df1[names(df2)] *NA^(rowCumsums(df2 == 0) > 0)
数据
df1
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))