R 如何将数据帧的行放在一起(自下而上选择行)

R 如何将数据帧的行放在一起(自下而上选择行),r,dataframe,R,Dataframe,我用一个例子来解释我的问题。例如,如果我在第5行(下表),如何获得第5行之前具有相同P\P值的行。关键是所选行的行索引应该是连续的。 例如,在下表的情况下,我只需要获得第3行和第4行(因为在第1行和其余行之间有第2行,其P\u P) 仅供参考,我可以使用for loop来完成它,但我想避免它 谢谢 ID Contest P_P Time 1 UMA A 2015 2 DOIS B 2016 3 DOIS A 2

我用一个例子来解释我的问题。例如,如果我在第5行(下表),如何获得第5行之前具有相同
P\P
值的行。关键是所选行的行索引应该是连续的。 例如,在下表的情况下,我只需要获得第3行和第4行(因为在第1行和其余行之间有第2行,其
P\u P
) 仅供参考,我可以使用
for loop
来完成它,但我想避免它

谢谢

ID   Contest   P_P   Time
1      UMA      A    2015
2      DOIS     B    2016
3      DOIS     A    2016
4      UMA      A    2017
5      DOIS     A    2017

您可以在
base
R中执行此操作:

rw <- 5
df[(max(which(!(df[1:(rw-1),]$P_P==df[rw,]$P_P)))+1):(rw-1),]

# ID Contest P_P Time
#3  3    DOIS   A 2016
#4  4     UMA   A 2017

下面是一个使用
rev()
rle()
的解决方案:

另一种解决方案:
我们可以使用
inverse.rle()
构建分组变量:

r <- rle(as.character(d$P_P)) # also possible: r <- rle(as.integer(d$P_P))
r$values <- seq(r$values)
d$group <- inverse.rle(r)
i <- 5
d[d$group==d$group[i],]    
如果希望结果不包含行
i

subset(d[-i,], group==d$group[i])
数据:

d
行。。。然后再细分。
r <- rle(as.character(d$P_P)) # also possible: r <- rle(as.integer(d$P_P))
r$values <- seq(r$values)
d$group <- inverse.rle(r)
i <- 5
d[d$group==d$group[i],]    
#  ID Contest P_P Time group
#3  3    DOIS   A 2016     3
#4  4     UMA   A 2017     3
#5  5    DOIS   A 2017     3
subset(d[-i,], group==d$group[i])
d <- structure(list(ID = 1:5, Contest = structure(c(2L, 1L, 1L, 2L, 
1L), .Label = c("DOIS", "UMA"), class = "factor"), P_P = structure(c(1L, 
2L, 1L, 1L, 1L), .Label = c("A", "B"), class = "factor"), Time = c(2015L, 
2016L, 2016L, 2017L, 2017L)), .Names = c("ID", "Contest", "P_P", 
"Time"), class = "data.frame", row.names = c(NA, -5L))
row <- 5

## get the subset with P_P = p-p of row 
subset <- subset(df[(row-1):1,], P_P == df[row,]$P_P)

## check the difference 
a <- which(abs(diff(subset$ID)) != 1)


subset[1:a[1],]

# ID Contest P_P Time
# 4  4     UMA   A 2017
# 3  3    DOIS   A 2016