【问题标题】:Create new variable if second row of a column matches a value in r如果列的第二行与 r 中的值匹配,则创建新变量
【发布时间】:2021-11-18 22:39:50
【问题描述】:

我想创建一个新变量 A_row_error,如果 first_A_row = TRUE 和下一行的消息 = ERROR(如果下一行 A_row_error = TRUE 是任何其他消息,则为 FALSE)。请注意,下一行由时间戳确定,并且必须按升序排列。 A_row_error 的 TRUE 消息也必须与 first_A_row = TRUE 位于同一行(有关所需输出,请参见下表)。

样本数据集:

participant_id <- c("ps1", "ps1", "ps1", "ps1", "ps2", "ps2", "ps3", "ps3", "ps3", "ps3")
timestamp <- c(0.01, 0.02, 0.03, 0.04, 0.01, 0.02, 0.01, 0.02, 0.03, 0.04)
event <- c("A", "A", "A", "B", "B", "A", "A", "A", "B", "A")
first_A_row <- c("TRUE", "FALSE", "FALSE", "FALSE", "FALSE", "TRUE", "TRUE", "FALSE", "FALSE", "FALSE")
message <- c("ACCEPTED", "ERROR", "DECLINED", "ACCEPTED", "HELLO", "BYE", "ACCEPTED", "BYE", "ERROR", "ACCEPTED")
data.frame(participant_id, timestamp, event, first_A_row, message)

期望的输出:

participant_id timestamp event first_A_row message A_row_error
ps1 0.01 A TRUE ACCEPTED TRUE
ps1 0.02 A FALSE ERROR FALSE
ps1 0.03 A FALSE DECLINED FALSE
ps1 0.04 B FALSE ACCEPTED FALSE
ps2 0.01 B FALSE HELLO FALSE
ps2 0.02 A TRUE BYE FALSE
ps3 0.01 A TRUE ACCEPTED FALSE
ps3 0.02 A FALSE BYE FALSE
ps3 0.03 B FALSE ERROR FALSE
ps3 0.04 A FALSE ACCEPTED FALSE

【问题讨论】:

    标签: r data-wrangling


    【解决方案1】:

    我们可以通过 'participant_id' 进行分组,并使用 'message' 的 lead 创建逻辑,即如果下一个值为 'ERROR' 并且 'first_A_row' 的给定行为 TRUE(@987654322 列@ 被创建为字符而不是逻辑 - 因此它被转换为 as.logical)

    library(dplyr)
    df1 %>% 
       group_by(participant_id) %>%
       mutate(A_row_error = lead(message, default = last(message)) == 
            'ERROR' & as.logical(first_A_row)) %>%
       ungroup
    

    -输出

    # A tibble: 10 × 6
       participant_id timestamp event first_A_row message  A_row_error
       <chr>              <dbl> <chr> <chr>       <chr>    <lgl>      
     1 ps1                 0.01 A     TRUE        ACCEPTED TRUE       
     2 ps1                 0.02 A     FALSE       ERROR    FALSE      
     3 ps1                 0.03 A     FALSE       DECLINED FALSE      
     4 ps1                 0.04 B     FALSE       ACCEPTED FALSE      
     5 ps2                 0.01 B     FALSE       HELLO    FALSE      
     6 ps2                 0.02 A     TRUE        BYE      FALSE      
     7 ps3                 0.01 A     TRUE        ACCEPTED FALSE      
     8 ps3                 0.02 A     FALSE       BYE      FALSE      
     9 ps3                 0.03 B     FALSE       ERROR    FALSE      
    10 ps3                 0.04 A     FALSE       ACCEPTED FALSE      
    

    【讨论】:

    • 再次感谢!我不知道默认值。这是将消息放在同一行的部分(#1)吗?
    • 我没有收到你的评论。
    • 这部分是 'default = last(message))' 是什么确保 A_row_error 下的 TRUE 出现在第一行(与 first_A_row 下的 TRUE 相同的行)?
    • @elmolibra 如果我们不指定默认值,它将是NA,然后== 将为该行返回NA,因为比较运算符的缺失值返回NA
    猜你喜欢
    • 1970-01-01
    • 2022-07-20
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    相关资源
    最近更新 更多