扔掉第一行和最后一行

时间:2012-04-11 17:05:06

标签: r data.table

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

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]

这当然不起作用,但是有一个更简单的解决方案,不需要额外的变量吗?

2 个答案:

答案 0 :(得分:4)

 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> 

答案 1 :(得分:3)

在这种情况下,您知道存在的一列(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