我正在尝试清理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
答案 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)))