繁体   English   中英

R:在满足条件的行中查找一个值,将某些数字添加到该值,然后在该行的另一列中创建一条消息

[英]R: Find a value in rows met a condition, add certain numbers to the value, and then create a message in that row in another column

我想在 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)

例如,当 B 列中出现“START”时,我想在“a”列中找到一个值。它将是 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 多个参与者。 我想在参与者的每次试验中创建“停止”消息。

我正在考虑使用 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"))

任何见解/建议将不胜感激!

你可以试试:

library(dplyr)

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

我们可以使用dplyrlag ,如下所示。 它要求您的列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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM