如何根据数据框中顶部值固定数量的列选择行?

时间:2015-12-04 14:13:59

标签: r

假设我有一个数据框,如:

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

3 个答案:

答案 0 :(得分:4)

df[c(1:3, (nrow(df)-2):nrow(df)), ]

答案 1 :(得分:4)

我们可以使用headtail

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