Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.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_Sequence - Fatal编程技术网

R 寻找第一集

R 寻找第一集,r,sequence,R,Sequence,我试图创建一个向量来指示序列的结束 我的数据如下所示: id time var wake 1 1 1 sleep 0 2 1 2 sleep 0 3 1 3 sleep 0 4 1 4 0 0 5 1 5 0 0 我想要的是这个(想要的输出) 我在想类似的事情 library(dplyr) dt$time = as.numeric(as.character(dt$time)) dt$v

我试图创建一个向量来指示序列的结束

我的数据如下所示:

   id time   var wake
1   1    1 sleep    0
2   1    2 sleep    0
3   1    3 sleep    0
4   1    4     0    0
5   1    5     0    0
我想要的是这个(想要的输出

我在想类似的事情

library(dplyr) 

dt$time = as.numeric(as.character(dt$time))
dt$var = ifelse(dt$var == 'sleep', 1, 0)

dt = dt %>% group_by(id) %>% 
mutate(grp = cumsum(var != lag(var, default = var[1])))

dt$wake = 0
dt$wake [dt$grp == 1] <- 1

一次通过库
数据。表

setDT(dt)
dt[,wake:=( c(0,diff( rleid(var) ) == 1) & var != "sleep"),by=id]
其思想是获取var的运行长度编码(
rleid
):

当从睡眠状态变为0或从0变为睡眠状态时,其差值为+1;当改变组时,其差值为负值(从1开始):

如果它是1,而var不是sleep,则获取一个真值(如果将整个内容包装为.numeric
,则可能是1)

输出:

    nrow id time   var  wake
 1:    1  1    1 sleep FALSE
 2:    2  1    2 sleep FALSE
 3:    3  1    3 sleep FALSE
 4:    4  1    4     0  TRUE
 5:    5  1    5     0 FALSE
 6:    6  1    6     0 FALSE
 7:    7  1    7     0 FALSE
 8:    8  1    8 sleep FALSE
 9:    9  1    9 sleep FALSE
10:   10  1   10 sleep FALSE
11:   11  2    1 sleep FALSE
12:   12  2    2 sleep FALSE
13:   13  2    3 sleep FALSE
14:   14  2    4 sleep FALSE
15:   15  2    5 sleep FALSE
16:   16  2    6     0  TRUE
17:   17  2    7     0 FALSE
18:   18  2    8     0 FALSE
19:   19  2    9 sleep FALSE
20:   20  2   10 sleep FALSE

以下内容应适用于
dplyr

library(dplyr)
dt <- dt %>% group_by(id) %>%
             mutate(wake = as.integer(var == '0' & var != lag(var, default = var[1])))
##Source: local data frame [20 x 4]
##Groups: id [2]
##
##       id   time    var  wake
##   <fctr> <fctr> <fctr> <dbl>
##1       1      1  sleep     0
##2       1      2  sleep     0
##3       1      3  sleep     0
##4       1      4      0     1
##5       1      5      0     0
##6       1      6      0     0
##7       1      7      0     0
##8       1      8  sleep     0
##9       1      9  sleep     0
##10      1     10  sleep     0
##11      2      1  sleep     0
##12      2      2  sleep     0
##13      2      3  sleep     0
##14      2      4  sleep     0
##15      2      5  sleep     0
##16      2      6      0     1
##17      2      7      0     0
##18      2      8      0     0
##19      2      9  sleep     0
##20      2     10  sleep     0
库(dplyr)
dt%分组单位(id)%>%
mutate(wake=as.integer(var='0'&var!=lag(var,default=var[1]))
##来源:本地数据帧[20 x 4]
##组别:id[2]
##
##id时间变量唤醒
##      
##1睡眠0
##2 1 2睡眠0
##3 1 3睡眠0
##4       1      4      0     1
##5       1      5      0     0
##6       1      6      0     0
##7       1      7      0     0
##818睡眠0
##9 1 9睡眠0
##10110睡眠0
##11 2 1睡眠0
##12 2睡眠0
##13 2 3睡眠0
##14 2 4睡眠0
##15 2 5睡眠0
##16      2      6      0     1
##17      2      7      0     0
##18      2      8      0     0
##1929睡眠0
##20 2 10睡眠0

var
var
lag
进行比较,如OP检测过渡(或发作)在
sleep
0
之间,但添加
var
需要为
0
的条件,以仅标记从
sleep
0
的转换,使
wake
成为
1
不是很优雅,但这可以完成工作。 确保事先按id和时间对
dt
进行排序

dt$id <- as.character(dt$id)
dt$time <- as.integer(as.character(dt$time))
dt$var <- as.character(dt$var)
dt <- dplyr::arrange(dt, id, time)
dt$wake <- 0
dt$wake[which(dt$var == "0" & lag(dt$var) == "sleep" & 
                dt$id == lag(dt$id))] <- 1

dt$id一种丑陋的方法是用i:th值减去i:th+1,看看睡眠是否结束,如下所示:

vec<-ifelse(dt$var=="sleep",1,0) #creating a vector for sleeping/not sleeping
tg<-c(0,vec[1:(length(vec)-1)])-vec #if values are == 1, i.e. first episode of not sleeping
library(dplyr)
dt %>% group_by(id) %>% mutate(wake = c(0, diff(var == 0) > 0)) %>% ungroup()
编辑:由于下面的评论,我更新了我的答案

vec<-ifelse(dt$var=="sleep",1,0)

lapply(unique(dt$id), function(x) ifelse(c(0,vec[min(which(dt$id==x)):(max(which(dt$id==x))-1)])-vec[dt$id==x]==1,1,0))

vec假设您要为每个
id
标记所有唤醒:

> dt[,rleid(var),by=id][,V1]
[1] 1 1 1 2 2 2 2 3 3 3 1 1 1 1 1 2 2 2 3 3
1)没有包请注意,如果
x
y
是逻辑的,则
x-y>0
iff
x
TRUE
y
FALSE
。因此,我们有以下不使用软件包的产品:

transform(dt, wake = ave(var == 0, id, FUN = function(x) c(0, diff(x) > 0)))
2)dplyr也可以用dplyr这样写:

vec<-ifelse(dt$var=="sleep",1,0) #creating a vector for sleeping/not sleeping
tg<-c(0,vec[1:(length(vec)-1)])-vec #if values are == 1, i.e. first episode of not sleeping
library(dplyr)
dt %>% group_by(id) %>% mutate(wake = c(0, diff(var == 0) > 0)) %>% ungroup()
3)zoo我们可以使用
rollappyr
沿着每个
id
查找序列
c(FALSE,TRUE)
in
var==0
。添加
0
可确保结果为数字

library(zoo)
roll <- function(x) rollapplyr(x, 2, identical, c(FALSE, TRUE), fill = 0)
transform(dt, wake = ave(var == 0, id, FUN = roll) + 0)

diff(rleid(dt$var))
这样的东西行吗?(使用
data.table
中的
rleid
)您可以澄清,如果
id
具有
var=c(“睡眠”、“睡眠”、0、0、“睡眠”、“睡眠”、0、0)
那么您想将所有waking标记为
wake=c(0、0、1、0、0、1、0)
还是将第一个标记为
wake=c(0、0、1、0、0、0)
谢谢。对不起,我对
数据表不太熟悉。
id
在这里是如何分组的?啊,对不起,我没有按id分组。我错过了你问题中的这一部分。我添加了
by=id
,它将通过id计算rle:pIt很容易理解,用as.integer替换as.numeric,as wake=as.integer(var!=lag(var,default=var[1]))
library(dplyr)
dt %>% group_by(id) %>% mutate(wake = c(0, diff(var == 0) > 0)) %>% ungroup()
library(zoo)
roll <- function(x) rollapplyr(x, 2, identical, c(FALSE, TRUE), fill = 0)
transform(dt, wake = ave(var == 0, id, FUN = roll) + 0)
transform(out, wake = ave(wake, id, FUN = function(x) replace(0*x, which.max(x), max(x))))