R:在行中找到一个符合条件的值,在该值上添加一定的数字,然后在该行中的另一列中创建一个消息

问题描述 投票:0回答:1

我想在R中做一件事,我相信应该有办法做到,但我想不通。

我想做的是根据另一列的信息在一列中找到一个值,给这个值加上数字,然后创建一个新的列。

a <- c(1, 2, 3, 4, 5, 6, 7, 8)
b <- c(NA, "START", NA, NA, NA, NA, NA, NA)
df <- data.frame(a, b)

例如,我想在列'a'中找到一个值,当'START'呈现在列B中时,它将是2。然后,在该值上添加3,并创建一个列'c',其中有一个'STOP'的信息在该行中(当列'a'中有5)。

所以,我希望结果像下面这样。

  a     b    c
1 1  <NA> <NA>
2 2 START <NA>
3 3  <NA> <NA>
4 4  <NA> <NA>
5 5  <NA> STOP
6 6  <NA> <NA>
7 7  <NA> <NA>
8 8  <NA> <NA>

每个参与者有12次试验,总共有80多个参与者,我想在每个试验中按参与者创建 "STOP "消息。

我想使用group_by和mutate函数,但显然没有成功。

library(dplyr)

df <- df %>%
      group_by(Participant, Trial) %>%
      mutate(time = df[df$b == "START","a"],
             stop = time + 3,
             c = case_when(df$time == stop ~ "STOP"))

任何见解建议都将是非常感激的!

r dplyr conditional-statements mutate
1个回答
1
投票

你可以尝试用.NET来实现。

library(dplyr)

df %>%
  mutate(c = NA) %>%
  group_by(Participant, Trial) %>%
  mutate(c = replace(c, {inds <- which(b == 'START') + 3;inds[inds <= n()]}, 'STOP'))

0
投票

我们可以使用 lagdplyr 如下所示。它需要你的列 a 是完整的(没有缺失,如1,2,4,......),并按顺序排列。

library(dplyr)

df %>%
  mutate(c = ifelse(lag(b, 3) %in% "START", "STOP", NA))
#   a     b    c
# 1 1  <NA> <NA>
# 2 2 START <NA>
# 3 3  <NA> <NA>
# 4 4  <NA> <NA>
# 5 5  <NA> STOP
# 6 6  <NA> <NA>
# 7 7  <NA> <NA>
# 8 8  <NA> <NA>
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.