【问题标题】:Replace remaining values in a data frame row with NA based on the first occurrence of a vale in another data frame根据另一个数据帧中第一次出现的值,用 NA 替换数据帧行中的剩余值
【发布时间】:2021-01-07 01:34:06
【问题描述】:

我有两个数据帧,其中一个具有数字行的子集并表示时间序列,另一个是与初始数据帧中的时间点相关的 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 中执行此操作的一种非常有效的方法

【问题讨论】:

    标签: r dataframe apply mapply


    【解决方案1】:

    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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-24
      • 2018-01-23
      • 2015-12-19
      • 2019-08-06
      • 2021-10-03
      相关资源
      最近更新 更多