在每个组中最后一次出现值后删除行

时间:2016-05-27 11:02:46

标签: r

我正在尝试清理R中的数据(cc.1M行)。 对于每个E(ntity),我想删除在V(alue)列中最后一次出现1之后的行。行按E和A(ttribute)排序。 什么是有效的方法呢?

示例:

从此

E = c(1,1,1,2,2,2,2,3,3,3,3,3) 
A = c(1,2,3,1,2,3,4,1,2,3,4,5) 
V = c(1,0,1,0,0,1,0,1,1,1,0,0)
df = data.frame(E,A,V)
df

我想创建这个

E = c(1,1,1,2,2,2,3,3,3) 
A = c(1,2,3,1,2,3,1,2,3) 
V = c(1,0,1,0,0,1,1,1,1)
df = data.frame(E,A,V)
df

2 个答案:

答案 0 :(得分:3)

我们可以使用data.table

library(data.table)   
setDT(df)[, .SD[seq_len(max(which(V==1)))], by = E]
#   E A V
#1: 1 1 1
#2: 1 2 0
#3: 1 3 1
#4: 2 1 0
#5: 2 2 0
#6: 2 3 1
#7: 3 1 1
#8: 3 2 1
#9: 3 3 1

或另一种选择是使用head(来自@Procrastinatus Maximus评论)

setDT(df)[, head(.SD, max(which(V==1))), by = E]

或者我们可以使用.I

setDT(df)[df[, .I[seq_len(max(which(V==1)))], by = E]$V1]

答案 1 :(得分:1)

使用dplyr

library(dplyr)
df %>% group_by(E) %>% slice(1:max(which(V == 1)))