如何使用data.table在子组中选择第N个元素?

时间:2019-04-18 18:44:40

标签: r data.table

简单的任务:我需要提取(比如说)子组的第一和第二元素。

DT <- data.table (X=c(1,2), Y=round(rnorm(5),1), key="X"); DT

       X     Y
1:     1  -0.4
2:     1   0.5
3:     1   1.2
4:     2   1.0
5:     2  -0.3

所以,我需要获取DT2,

1:     1  -0.4
2:     1   0.5
3:     2   1.0
4:     2  -0.3

这不起作用:

 DT2 <- DT[, .(first = .SD[1], second=.SD[2]), by=X]

什么有效?

4 个答案:

答案 0 :(得分:1)

我们可以按0 0 0 0 1 1 0 2 2 0 3 3 0 4 4 0 5 5 0 6 6 0 7 7 0 8 8 0 9 9 0 10 10 0 11 11 1 0 12 1 1 13 1 2 14 1 3 15 1 4 16 1 5 17 1 6 18 1 7 19 1 8 20 1 9 21 1 10 22 1 11 23 2 0 24 2 1 25 2 2 26 2 3 27 2 4 28 2 5 29 2 6 30 2 7 31 2 8 32 2 9 33 2 10 34 2 11 35 . . . . . . . . . . . . . . . 11 9 141 11 10 142 11 11 143

进行分组
head

或提取行索引(DT[, head(.SD, 2), X] )和子集

.I

答案 1 :(得分:0)

以下代码也产生相同的结果。如果订购很重要,可以预先运行setkey或order。

DT <- data.table (X=c(1,2), Y=round(rnorm(5),1), key="X"); DT
   X    Y
1: 1  0.5
2: 1  1.4
3: 1  0.0
4: 2 -1.5
5: 2 -0.3

DT[,Y[1:2],.(X)]

   X   V1
1: 1  0.5
2: 1  1.4
3: 2 -1.5
4: 2 -0.3

答案 2 :(得分:0)

这就是我要这样做的方式,我认为(由软件包作者编写)预期方式:

DT[, .SD[1:2], by = X]

答案 3 :(得分:-2)

这是使用tidyverse / dplyr的解决方案。第一部分使用tibble,这是常规数据帧的扩展。

library(tidyverse)

df <- tibble(
  x = c(1, 1, 1, 2, 2),
  y = c(-0.4, 0.5, 1.2, 1.0, -0.3)
)

df
# A tibble: 5 x 2
      x     y
  <dbl> <dbl>
1     1  -0.4
2     1   0.5
3     1   1.2
4     2   1  
5     2  -0.3

df2 <-
  df %>% 
  group_by(x) %>% 
  slice(1:2) %>% 
  ungroup()

df2
# A tibble: 4 x 2
      x     y
  <dbl> <dbl>
1     1  -0.4
2     1   0.5
3     2   1  
4     2  -0.3