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

R 如何在事件发生后删除数据?

R 如何在事件发生后删除数据?,r,dplyr,R,Dplyr,这是我的数据,我希望在事件发生后删除ID的所有数据 ID Event time 1 0 1 1 1 2 2 0 3 1 0 4 2 0 5 由于ID 1的事件大于0,因此我想删除ID 1的所有后续数据。所以,我去掉第4行,理想的输出是 ID Event time 1 0 1 1 1 2 2 0 3 2 0 5

这是我的数据,我希望在事件发生后删除ID的所有数据

ID   Event  time
1      0     1
1      1     2
2      0     3
1      0     4
2      0     5
由于ID 1的事件大于0,因此我想删除ID 1的所有后续数据。所以,我去掉第4行,理想的输出是

 ID   Event  time
  1     0     1
  1     1     2
  2     0     3
  2     0     5
我该怎么做

 dput(df)
structure(list(ID = c(1L, 1L, 2L, 1L, 2L), Event = c(0L, 1L, 
0L, 0L, 0L), time = 1:5), .Names = c("ID", "Event", "time"), class = "data.frame", row.names = c(NA, 
-5L))

使用dplyr,您可以
筛选
时间
值小于
事件
为1的最小值,并按
ID
分组:

library(dplyr)

df %>% group_by(ID) %>% filter(time <= min(time[Event == 1]))

## Source: local data frame [4 x 3]
## Groups: ID [2]
## 
##      ID Event  time
##   <int> <int> <int>
## 1     1     0     1
## 2     1     1     2
## 3     2     0     3
## 4     2     0     5

这两种方法都依赖于这样一个事实,即
min(整数(0))
ID
没有1个值时返回
Inf
,但如果愿意,可以添加
if
条件来明确说明这种情况。

使用dplyr,您可以
筛选
时间
值小于
事件
为1的最小值,并按
ID
分组:

library(dplyr)

df %>% group_by(ID) %>% filter(time <= min(time[Event == 1]))

## Source: local data frame [4 x 3]
## Groups: ID [2]
## 
##      ID Event  time
##   <int> <int> <int>
## 1     1     0     1
## 2     1     1     2
## 3     2     0     3
## 4     2     0     5

这两种方法都依赖于这样一个事实,即
min(整数(0))
ID
没有1个值时返回
Inf
,但如果您愿意,可以添加
if
条件来明确说明这种情况。

这里有一个选项使用
匹配
数据。table

library(data.table)
setDT(df)[, .SD[seq_len(match(1, Event, nomatch = .N))], ID]
#   ID Event time
#1:  1     0    1
#2:  1     1    2
#3:  2     0    3
#4:  2     0    5

这里有一个选项,使用
匹配
数据。表

library(data.table)
setDT(df)[, .SD[seq_len(match(1, Event, nomatch = .N))], ID]
#   ID Event time
#1:  1     0    1
#2:  1     1    2
#3:  2     0    3
#4:  2     0    5

我尝试了一些非常复杂的方法,为有事件的人和没有事件的人创建了两组数据集,我给他们两人都分配了一个时间序列,并最后(time.x))输出了
,但毕竟它没有给我想要的输出。我想也许有一种简单的方法我忽略了,我假设是
dplyr::filter
,而不是
stats::filter
。使用dplyr,
df%>%group\u by(ID)%%>%filter(感谢@alistaire。你太棒了!哎呀,这应该是
df%>%group\u by(ID)%%>%filter(时间GREST。请考虑写下你的答案。它是可读的,漂亮的,而且工作得很好,因为我尝试了一些非常复杂的东西,为那些有事件的人创建了一套数据集,而对于那些没有事件的人,我给他们俩分配了一个时间序列,并且做了<代码>输出最后(time .x))。
毕竟它没有给我想要的输出。我想也许有一个简单的方法我错过了。我假设这是
dplyr::filter
,而不是
stats::filter
。使用dplyr,
df%>%groupby(ID)%%>%filter(时间感谢@alistaire。你太棒了!哦,这应该是
df%>%groupby(ID)%%过滤器(时间绿色)。请考虑写下你的答案。它是可读的,漂亮的,而且工作得很好,因为我认为这里必须有一些简单的东西,但是我真的不能做得更好。我最好的尝试是<代码> DF[AWA](DF$事件,DF$ID,乐趣=函数(x)Rev(CUMUM(Rev(x))==0和任何(x)),]
我认为这里一定有一些简单的东西,但我实在是做得太好了。我最好的尝试是
df[!ave(df$Event,df$ID,FUN=function(x)rev(cumsum(rev(x)))==0&any(x)),]