假设我有一个如下所示的数据框 (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 跟随包含变量的字符串
python - 如何将值合并到 discord.py 中的一条消息中
python - Colab 中没有名为 'statsmodels.tsa.arima' 的模块,但
typescript - 将泛型参数约束为 Typescript 中的联合类型
python - UUID 对于 Centos 操作系统上的不同进程保持不变,但在 Windows