【问题标题】:Row wise comparison of a dataframe in RR中数据帧的逐行比较
【发布时间】:2021-05-26 16:42:49
【问题描述】:

我有一个数据框,其中包含与每个 ID 对应的多个数据点。当 ID 的 2 个时间点之间的状态值不同时,我想标记第一次状态更改。我如何在 R 中实现这一点?下面是一个示例数据集。

ID Time Status
ID1 0 X
ID1 6 X
ID1 12 Y
ID1 18 Z

结果数据集

ID Time Status Flag
ID1 0 X
ID1 6 X
ID1 12 Y 1
ID1 18 Z

【问题讨论】:

    标签: r compare row data-manipulation data-transform


    【解决方案1】:

    这是带有ave 的基本 R 解决方案。它创建一个向量y,每当前一个值与当前值不同时,它就等于 1。然后用diff 计算Flag

    y <- with(df1, ave(Status, ID, FUN = function(x) c(0, x[-1] != x[-length(x)])))
    df1$Flag <- c(0, diff(as.integer(y)) != 0)
    
    df1
    #   ID Time Status Flag
    #1 ID1    0      X    0
    #2 ID1    6      X    0
    #3 ID1   12      Y    1
    #4 ID1   18      Z    0
    

    数据

    df1 <- read.table(text = "
    ID  Time    Status
    ID1     0   X
    ID1     6   X
    ID1     12  Y
    ID1     18  Z                  
    ", header = TRUE)
    

    【讨论】:

      【解决方案2】:

      您可以将mutate()与ifelse()和lag()一起使用,然后用replace()将非第一个Flag==1替换为0:

      df1%>%group_by(ID)%>%
              mutate(Flag=ifelse(is.na(lag(Status)), 0,
                                as.integer(Time!=lag(Time) & Status!=lag(Status))))%>%
              group_by(ID, Flag)%>%
              mutate(Flag=replace(Flag, Flag==lag(Flag) & Flag==1, 0))
      
      # A tibble: 4 x 4
      # Groups:   ID, Flag [2]
        ID     Time Status  Flag
        <fct> <int> <fct>  <dbl>
      1 ID1       0 X          0
      2 ID1       6 X          0
      3 ID1      12 Y          1
      4 ID1      18 Z          0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-20
        • 1970-01-01
        • 2023-03-04
        • 2019-01-02
        • 2017-04-26
        • 2021-12-24
        相关资源
        最近更新 更多