R 根据其他列的条件标记列中连续出现的值
问题的细节:我创建了一个玩具示例。每个人都有一个时间序列响应向量,指示受试者在整个时间序列中是在睡觉、吃饭还是在走路。就本例而言,在“睡眠”之后立即出现的所有连续“吃”都是重要的。我有一个场景,在这个场景中,我创建了一个计数器变量,用于统计向量中连续出现的相同响应。然而,我只想保留或标记睡眠后连续出现的“吃”次数 在下面的代码中:我创建了一个lag-1变量,然后为sleep之后的每个“eat”实例创建一个标志。但是,这只标记“eat”的每个实例的开始,我想标记“sleep”之后出现的所有“eat”,以便我可以根据下面代码中的计数器变量创建摘要统计信息 我被困在如何解决这个问题上 代码如下:R 根据其他列的条件标记列中连续出现的值,r,R,问题的细节:我创建了一个玩具示例。每个人都有一个时间序列响应向量,指示受试者在整个时间序列中是在睡觉、吃饭还是在走路。就本例而言,在“睡眠”之后立即出现的所有连续“吃”都是重要的。我有一个场景,在这个场景中,我创建了一个计数器变量,用于统计向量中连续出现的相同响应。然而,我只想保留或标记睡眠后连续出现的“吃”次数 在下面的代码中:我创建了一个lag-1变量,然后为sleep之后的每个“eat”实例创建一个标志。但是,这只标记“eat”的每个实例的开始,我想标记“sleep”之后出现的所有“eat
# load libraries
packs <- c('data.table', 'dplyr')
lapply(packs, require, character.only = TRUE)
# 1. initiate data
df <- data.frame(
id = c(rep(101, 6), rep(102, 8)),
response = c('sleep', 'sleep', 'sleep', 'eat', 'eat', 'walk', 'walk', 'sleep', 'sleep', 'eat', 'eat', 'walk', 'eat', 'walk'))
# 2. create the lag-1 variable and flag for that start of all occurrences of
df <- df %>%
mutate(lag_response = lag(response, 1),
flag = case_when(lag_response == 'sleep' & response == "eat" ~ 1)) %>%
select(id, lag_response, response, flag)
# 3. create consecutive counter for responses
df <- transform(df, counter = ave(c(response), rleid(id, c(response)), FUN = seq_along))
# 4. example of desired column
df <- df %>%
mutate(
desired_col = c(0,0,0,1,1,0,0,0,0,1,1,0,0,0))
#加载库
packs我们可以通过使用lead
比较“response”值即“sleep”和下一个值即“eat”来创建“flag”,该值按“response”的rleid
分组,通过使用any
TRUE进行更改来修改“flag”
library(dplyr)
library(data.table)
df %>%
mutate(flag = lag(response == 'sleep' & lead(response) == 'eat',
default = FALSE)) %>%
group_by(grp = rleid(response)) %>%
mutate(flag = +any(flag)) %>%
ungroup %>%
select(-grp)
在base中,您可以使用ave
。要从sleep
切换到eat
,只需与移位指数进行比较。要将命中传播到以下所有eats
中,可以使用diff
和cumsum
来定义组
df$f <- ave(c(FALSE, df$response[-nrow(df)] == "sleep" & df$response[-1] == "eat")
, cumsum(c(FALSE, diff(unclass(df$response)) != 0))
, FUN=function(x) x[1])
df
# id response f
#1 101 sleep FALSE
#2 101 sleep FALSE
#3 101 sleep FALSE
#4 101 eat TRUE
#5 101 eat TRUE
#6 101 walk FALSE
#7 102 walk FALSE
#8 102 sleep FALSE
#9 102 sleep FALSE
#10 102 eat TRUE
#11 102 eat TRUE
#12 102 walk FALSE
#13 102 eat FALSE
#14 102 walk FALSE
df$f