R 如何将数据帧的行放在一起(自下而上选择行)
我用一个例子来解释我的问题。例如,如果我在第5行(下表),如何获得第5行之前具有相同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
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