【问题标题】:Replace the same values in the consecutive rows and stop replacing once the value has changed in R替换连续行中的相同值,并在 R 中的值发生更改后停止替换
【发布时间】:2020-10-29 15:34:12
【问题描述】:

我想找到一种方法在每次试验开始时将连续的相同值替换为 0,但是一旦值发生更改,它应该停止替换并保留该值。它应该发生在每个受试者的每次试验中。

例如,第一个受试者有多个试验(1、2 等)。在每个试验开始时,可​​能会有一些具有相同值的连续行(例如,1、1、1)。对于这些值,我想将它们替换为 0。但是,一旦值从 1 变为 0,我想在试验的其余部分保留这些值(例如,0、0、1)。

subject <- c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
trial <- c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2)
value <- c(1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1)
df <- data.frame(subject, trial, value)

因此,从原始数据框中,我想有一个新变量(value_new),如下所示。

   subject trial value value_new
1        1     1     1         0
2        1     1     1         0
3        1     1     1         0
4        1     1     0         0
5        1     1     0         0
6        1     1     1         1
7        1     2     1         0
8        1     2     1         0
9        1     2     0         0
10       1     2     1         1
11       1     2     1         1
12       1     2     1         1

我正在考虑使用 tidyr 和 group_by(subject, trial) 并使用条件语句改变一个新变量,但不知道该怎么做。我想我需要使用 rle(),但同样不知道如何将连续值替换为 0,一旦值发生更改就停止替换并保留其余值。

任何建议或意见将不胜感激!

【问题讨论】:

    标签: r replace conditional-statements


    【解决方案1】:

    你可以从data.table 使用rleid

    library(data.table)
    setDT(df)[, new_value := value * +(rleid(value) > 1), .(subject, trial)]
    df
    
    #    subject trial value new_value
    # 1:       1     1     1         0
    # 2:       1     1     1         0
    # 3:       1     1     1         0
    # 4:       1     1     0         0
    # 5:       1     1     0         0
    # 6:       1     1     1         1
    # 7:       1     2     1         0
    # 8:       1     2     1         0
    # 9:       1     2     0         0
    #10:       1     2     1         1
    #11:       1     2     1         1
    #12:       1     2     1         1
    

    您也可以使用 dplyr 来执行此操作:

    library(dplyr)
    
    df %>%
      group_by(subject, trial) %>%
      mutate(new_value = value * +(rleid(value) > 1))
    

    【讨论】:

    • dplyr 中有rleid 函数吗?
    • 不,我的意思是我们可以在 dplyr 语法中使用来自 data.tablerleid 函数。
    • 太棒了!谢谢您的帮助。我真的很感激。
    猜你喜欢
    • 2021-02-21
    • 2021-12-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 2014-10-15
    • 1970-01-01
    相关资源
    最近更新 更多