假设我有一个数据框,如:
df0 <- data.frame(x=c(-5, -4.5, -3, -2, 0, 1, 2, 3, 4, 5, 6, 7),
y=letters[1:12])
df0
x y
# 1 -5.0 a
# 2 -4.5 b
# 3 -3.0 c
# 4 -2.0 d
# 5 0.0 e
# 6 1.0 f
# 7 2.0 g
# 8 3.0 h
# 9 4.0 i
# 10 5.0 j
# 11 6.0 k
# 12 7.0 l
我希望它根据列df
从两侧按x
的6行进行子集(即来自底部最小值的3个和来自x
的最大值的3个),例如:
df1<-data.frame(x=c(-5, -4.5, -3, 5, 6, 7),
y=c("a", "b", "c", "j", "k", "l"))
df1
# x y
# 1 -5.0 a
# 2 -4.5 b
# 3 -3.0 c
# 4 5.0 j
# 5 6.0 k
# 6 7.0 l
答案 0 :(得分:4)
df[c(1:3, (nrow(df)-2):nrow(df)), ]
答案 1 :(得分:4)
我们可以使用head
和tail
rbind(head(df0,3), tail(df0,3))
答案 2 :(得分:2)
这是 dplyr 方式:
library(dplyr)
df0 %>% filter(!between(row_number(), 4, n()-3))
然而,这比其他答案更冗长,更慢。使用这个答案的唯一理由是加强哈德利的霸权。
library(microbenchmark)
mplourde <- function() df0 %>% filter(!between(row_number(), 4, n()-3))
akrun <- function() rbind(head(df0,3), tail(df0,3))
ven <- function() df0[c(1:3, (nrow(df0)-2):nrow(df0)), ]
microbenchmark(mplourde(), akrun(), ven())
# Unit: microseconds
# expr min lq mean median uq max neval
# mplourde() 474.69 505.19 551.39 520.30 551.2 2165.59 100
# akrun() 253.74 275.69 301.21 291.37 310.8 746.10 100
# ven() 38.77 48.04 53.72 51.75 58.3 91.23 100