r - 根据R中的条件定义元素

假设我有一个如下所示的数据框 (df):

stim <- c("a", "k", "y", "j", "t", "Stop", "f", "l", "b", "a", "c", "Stop")
df <- data.frame(stim)

我想根据“stim”的值创建另一列“YesorNo”。我想要的输出是这样的:

stim  YesorNo
 a      yes
 k      yes
 y      yes
 j      yes
 t       No
 Stop   N/A
 f      yes
 l      yes
 b      yes
 a      yes
 c       No
 Stop   N/A
 ...    ...

如果 stim 是“停止”,我希望“YesorNo”的值是 N/A。我可以为此使用一个简单的 ifelse 语句 ( df$YesorNo <- ifelse(df$stim=="Stop", "N/A", "yes" ) 但我也希望“停止”之前的值(在我的示例中为字母 t 和 c)对应于“否”而不是"is"。我将如何定义它?

最佳答案

您可以使用 lead 查找下一个值,使用 case_when 列出条件。

library(dplyr)

df %>%
  mutate(YesorNo = case_when(stim == 'Stop' ~ NA_character_, 
                             lead(stim) == 'Stop' ~ "No", 
                             TRUE ~ 'Yes'))

#   stim YesorNo
#1     a     Yes
#2     k     Yes
#3     y     Yes
#4     j     Yes
#5     t      No
#6  Stop    <NA>
#7     f     Yes
#8     l     Yes
#9     b     Yes
#10    a     Yes
#11    c      No
#12 Stop    <NA>

data.table类似,您可以使用fcase

setDT(df)[, YesorNo := fcase(stim == 'Stop', NA_character_, 
                             shift(stim, type = 'lead') == 'Stop', "No", 
                             default = "Yes")]
df

https://stackoverflow.com/questions/69023354/

相关文章:

python - 属性错误 : module 'numpy.core' has no attribu

regex - 下一个单词的 GREP 跟随包含变量的字符串

javascript - 使用键映射和过滤对象数组

python - 如何将值合并到 discord.py 中的一条消息中

python - Colab 中没有名为 'statsmodels.tsa.arima' 的模块,但

typescript - 将泛型参数约束为 Typescript 中的联合类型

python - UUID 对于 Centos 操作系统上的不同进程保持不变,但在 Windows

javascript - Puppeteer 仅用于 chrome 浏览器吗?

python - 如何将第一列的值分成另外两列

r - 如何排除 R 中计算均值和标准差的月份