R 如何在事件发生后删除数据?
这是我的数据,我希望在事件发生后删除ID的所有数据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 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)),]