【发布时间】: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_value在trial3 中的“开始”之后没有改变? -
我的错误。是的,第 7 行应该是 1。在试验 3 中“开始”之后 new_value 没有变化的原因是因为值在“开始”处发生了变化(第 15 行 = 0,第 17 行(“开始”) = 1)。在另外两个试验中,前一行的值与“开始”处的值相同,这就是为什么我想将“开始”之后的那些连续值替换为 0。如果上一行和开始之间的值是不同,我想在开始后保留这些值。如果仍然令人困惑,请告诉我!
标签: r replace conditional-statements