根据在另一个数据框中首次出现的值,用 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))
我有两个数据框,其中一个包含数字行的子集并表示时间序列,另一个是与初始数据框中的时间点相关的 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))