2012-04-11 57 views
4

我在R有一个data.table,我想扔掉第一行和最后n行。我想先应用一些过滤,然后截断结果。我知道我可以这样做:丢掉第一行和最后n行

example=data.table(row1=seq(1,1000,1),row2=seq(2, 3000,3)) 
e2=example[row1%%2==0] 
e2[100:(nrow(e2)-100)] 

是否有可能在一行中做到这一点?我认为是这样的:

example[row1%%2==0][100:-100] 

当然不工作的这一点,但有它不需要额外的变量简单的解决方案?

+1

你测试了'e2 [100:length(e2)-100]'这一行吗?我认为你的意思是'nrow'而不是'length'('length(DT)'是列的数量),并且需要括号来替换':',它的优先级高于'-'。我将编辑问题和答案...... – 2012-04-13 09:22:20

+0

你是对的,我的例子没有回复我的意图。 – theomega 2012-04-13 09:40:50

回答

2

在你知道这种情况下,存在一列的名称(row1),所以使用length(<any column>)返回未命名的临时data.table内的行数:

example=data.table(row1=seq(1,1000,1),row2=seq(2, 3000,3)) 

e2=example[row1%%2==0] 
ans1 = e2[100:(nrow(e2)-100)] 

ans2 = example[row1%%2==0][100:(length(row1)-100)] 

identical(ans1,ans2) 
[1] TRUE 
3
example=data.table(row1=seq(1,1000,1),row2=seq(2, 3000,3)) 
n = 5 
str(example[!rownames(example) %in% 
       c(head(rownames(example), n), tail(rownames(example), n)), ]) 
Classes ‘data.table’ and 'data.frame': 990 obs. of 2 variables: 
$ row1: num 6 7 8 9 10 11 12 13 14 15 ... 
$ row2: num 17 20 23 26 29 32 35 38 41 44 ... 
- attr(*, ".internal.selfref")=<externalptr> 

添加一行代码版本的选择标准

str( 
    (res <- example[row1 %% 2 == 0])[ n:(nrow(res)-n), ] 
    ) 
Classes ‘data.table’ and 'data.frame': 491 obs. of 2 variables: 
$ row1: num 10 12 14 16 18 20 22 24 26 28 ... 
$ row2: num 29 35 41 47 53 59 65 71 77 83 ... 
- attr(*, ".internal.selfref")=<externalptr> 

再添加这个版本不使用中间命名值

str( 
example[row1 %% 2 == 0][n:(sum(row1 %% 2==0)-n), ] 
    ) 
Classes ‘data.table’ and 'data.frame': 491 obs. of 2 variables: 
$ row1: num 10 12 14 16 18 20 22 24 26 28 ... 
$ row2: num 29 35 41 47 53 59 65 71 77 83 ... 
- attr(*, ".internal.selfref")=<externalptr>