Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 根据其他列的条件标记列中连续出现的值_R - Fatal编程技术网

R 根据其他列的条件标记列中连续出现的值

R 根据其他列的条件标记列中连续出现的值,r,R,问题的细节:我创建了一个玩具示例。每个人都有一个时间序列响应向量,指示受试者在整个时间序列中是在睡觉、吃饭还是在走路。就本例而言,在“睡眠”之后立即出现的所有连续“吃”都是重要的。我有一个场景,在这个场景中,我创建了一个计数器变量,用于统计向量中连续出现的相同响应。然而,我只想保留或标记睡眠后连续出现的“吃”次数 在下面的代码中:我创建了一个lag-1变量,然后为sleep之后的每个“eat”实例创建一个标志。但是,这只标记“eat”的每个实例的开始,我想标记“sleep”之后出现的所有“eat

问题的细节:我创建了一个玩具示例。每个人都有一个时间序列响应向量,指示受试者在整个时间序列中是在睡觉、吃饭还是在走路。就本例而言,在“睡眠”之后立即出现的所有连续“吃”都是重要的。我有一个场景,在这个场景中,我创建了一个计数器变量,用于统计向量中连续出现的相同响应。然而,我只想保留或标记睡眠后连续出现的“吃”次数

在下面的代码中:我创建了一个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