我有一个相当大的数据框,大约有~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进行子集,但不确定如何。
答案 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
使用tidyverse
与top_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
进行分组,并使用a
和slice
选择最后3行。
tail
答案 2 :(得分:2)
您可以split
按a
然后为每个子组保留最后三行
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