【问题标题】:Replace the same values in the consecutive rows and stop replacing once the value has changed in R but conditionally keep values替换连续行中的相同值,并在 R 中的值发生更改后停止替换,但有条件地保留值
【发布时间】:2021-02-21 23:09:56
【问题描述】:

我之前问过类似的问题,确实解决了这个问题。看到这个帖子: Replace the same values in the consecutive rows and stop replacing once the value has changed in R

不幸的是,我意识到我需要一个额外的条件语句。

我之前想要的如下:

  • 在每次试验开始时将连续的相同值替换为 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

我现在想要的略有不同。现在我有一个消息栏。 我愿意

  • 在“开始”之后将连续相同的值替换为 0
  • 一旦值发生变化,它应该停止替换并保留该值
  • 应在每个受试者和每个试验中重复
  • 重要的是,如果值在“开始”之前刚刚更改,我想保留开始之后的所有值
subject <- c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) 
trial <- c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3)
value <- c(1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0)
message <- c("NA", "start", "NA", "NA", "NA", "NA", "NA", "NA", "start", "NA", "NA", "NA", "NA","NA", "NA", "start", "NA", "NA", "NA", "NA", "NA")
df <- data.frame(subject, trial, value, message)
df

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

   subject trial value message new_value
1        1     1     1      NA         1
2        1     1     1   start         0
3        1     1     1      NA         0
4        1     1     1      NA         0
5        1     1     0      NA         0
6        1     1     0      NA         0
7        1     1     1      NA         1
8        1     2     1      NA         1
9        1     2     1   start         0
10       1     2     1      NA         0
11       1     2     0      NA         0
12       1     2     1      NA         1
13       1     2     1      NA         1
14       1     2     1      NA         1
15       1     3     0      NA         0
16       1     3     1   start         1
17       1     3     1      NA         1
18       1     3     1      NA         1
19       1     3     1      NA         1
20       1     3     1      NA         1
21       1     3     0      NA         0

我收到了一条建议使用 dplyr 的评论。

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

作为 R 初学者,我想不出如何调整它以适应新情况。 我在想ifelse,但仍然不知道在哪里以及如何放置它。

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

【问题讨论】:

  • 第 7 行应该是第 1 行吗?还有为什么new_valuetrial 3 中的“开始”之后没有改变?
  • 我的错误。是的,第 7 行应该是 1。在试验 3 中“开始”之后 new_value 没有变化的原因是因为值在“开始”处发生了变化(第 15 行 = 0,第 17 行(“开始”) = 1)。在另外两个试验中,前一行的值与“开始”处的值相同,这就是为什么我想将“开始”之后的那些连续值替换为 0。如果上一行和开始之间的值是不同,我想在开始后保留这些值。如果仍然令人困惑,请告诉我!

标签: r replace conditional-statements


【解决方案1】:

你可以把之前的答案改成:

library(dplyr)
library(data.table)

df %>%
  group_by(subject, trial) %>%
  mutate(new_value = value * +(rleid(value) > 1 | 
                               row_number() < match('start', message)))

#   subject trial value message new_value
#1        1     1     1      NA         1
#2        1     1     1   start         0
#3        1     1     1      NA         0
#4        1     1     1      NA         0
#5        1     1     0      NA         0
#6        1     1     0      NA         0
#7        1     1     1      NA         1
#8        1     2     1      NA         1
#9        1     2     1   start         0
#10       1     2     1      NA         0
#11       1     2     0      NA         0
#12       1     2     1      NA         1
#13       1     2     1      NA         1
#14       1     2     1      NA         1
#15       1     3     0      NA         0
#16       1     3     1   start         1
#17       1     3     1      NA         1
#18       1     3     1      NA         1
#19       1     3     1      NA         1
#20       1     3     1      NA         1
#21       1     3     0      NA         0

这里我们添加了一个附加条件,以保持'start' 之前的行与value 相同。

【讨论】:

  • 对于这个延迟的评论,我深表歉意。我有一段时间没有更改查看此数据集并返回它。非常感谢您的帮助!
猜你喜欢
  • 2020-10-29
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-07
  • 2013-07-13
  • 1970-01-01
  • 2020-01-20
  • 2016-11-29
相关资源
最近更新 更多