在数据框中保留行

时间:2017-03-01 03:52:01

标签: r

我有一个相当大的数据框,大约有~100列,我需要从中删除很多行。仅在标题中难以描述,但更容易展示一个例子,然后解释:

temp = data.frame(a = c(1,1,1,1,1,2,2,2,2,3,3,3,3,3,3), b = LETTERS[1:15])
temp
   a b
1  1 A
2  1 B
3  1 C
4  1 D
5  1 E
6  2 F
7  2 G
8  2 H
9  2 I
10 3 J
11 3 K
12 3 L
13 3 M
14 3 N
15 3 O

有了这个,我想只保留与a列中每个唯一编号的最后3个外观相对应的行。也就是说,我试图获得一个如下所示的数据框:

my_final_df
   a b 
1  1 C
2  1 D
3  1 E
4  2 G
5  2 H
6  2 I
7  3 M
8  3 N
9  3 0

对于我的完整数据帧,“a”列中某个数字的最后3行以外的任何数据都是噪声,这就是我想删除它们的原因。我想我需要创建一个类型的布尔向量来做这个,然后使用布尔向量对my_df进行子集,但不确定如何。

3 个答案:

答案 0 :(得分:3)

我们可以在data.table

中紧凑地执行此操作
library(data.table)
setDT(temp)[, tail(.SD, 3) , a]
#   a b
#1: 1 C
#2: 1 D
#3: 1 E
#4: 2 G
#5: 2 H
#6: 2 I
#7: 3 M
#8: 3 N
#9: 3 O

使用tidyversetop_n

的选项
library(tidyverse)
temp %>% 
    group_by(a) %>% 
    top_n( 3, rank(row_number()))
#     a      b
#   <dbl> <fctr>
#1     1      C
#2     1      D
#3     1      E
#4     2      G
#5     2      H
#6     2      I
#7     3      M
#8     3      N
#9     3      O

答案 1 :(得分:2)

使用import math >>> def f(x): return (x**2)-2 >>> def bisect (a,b,n): while n < 6: c=(a+b)/2 if f(c) == 0: print [('Root is: ', c)] elif f(a)*f(b) > 0: b=c n=(n+1) print [('n: ',n,' c: ',c)] else: a=c n=(n+1) print [('n: ',n,' c: ',c)] >>> print bisect (0,1,0) SyntaxError: invalid syntax >>> print bisect (0,1,0): SyntaxError: invalid syntax >>> ,我们可以按dplyr进行分组,并使用aslice选择最后3行。

tail

答案 2 :(得分:2)

您可以splita然后为每个子组保留最后三行

do.call(rbind, lapply(split(temp, temp$a), function(x) tail(x,3)))
#     a b
#1.3  1 C
#1.4  1 D
#1.5  1 E
#2.7  2 G
#2.8  2 H
#2.9  2 I
#3.13 3 M
#3.14 3 N
#3.15 3 O