简单的任务:我需要提取(比如说)子组的第一和第二元素。
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]
什么有效?
答案 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