gpt4 book ai didi

R data.table 在组内进行子集并将数据表拆分为两个

转载 作者:行者123 更新时间:2023-12-04 23:23:19 25 4
gpt4 key购买 nike

我有以下数据表。

ts,id
1,a
2,a
3,a
4,a
5,a
6,a
7,a
1,b
2,b
3,b
4,b

我想将这个 data.table 分成两个子集。标准是每个组的前半部分(在本例中为“id”列)在一个数据表中,其余部分在另一个数据表中。所以预期的结果是两个data.tables如下
ts,id
1,a
2,a
3,a
4,a
1,b
2,b


 ts,id
5,a
6,a
7,a
3,b
4,b

我尝试了以下,
z1 = x[,.SD[.I < .N/2,],by=dev]
z1

并得到以下信息
id ts
a 1
a 2
a 3

不知何故,.SD 中的 .I 并没有像我认为的那样工作。任何帮助表示赞赏。
提前致谢。

最佳答案

.I给出相对于整个 data.table 的行位置。因此它不能在 .SD 中那样使用.

就像是

DT[, subset := seq_len(.N) > .N/2,by='id']

subset1 <- DT[(subset)][,subset:=NULL]
subset2 <- DT[!(subset)][,subset:=NULL]

subset1
# ts id
# 1: 4 a
# 2: 5 a
# 3: 6 a
# 4: 7 a
# 5: 3 b
# 6: 4 b
subset2
# ts id
# 1: 1 a
# 2: 2 a
# 3: 3 a
# 4: 1 b
# 5: 2 b

应该管用

对于 2 个以上的组,您可以使用 cut创建一个具有适当数量级别的因子

就像是
 DT[, subset := cut(seq_len(.N), 3, labels= FALSE),by='id']
# you could copy to the global environment a subset for each, but this
# will not be memory efficient!
list2env(setattr(split(DT, DT[['subset']]),'names', paste0('s',1:3)), .GlobalEnv)

关于R data.table 在组内进行子集并将数据表拆分为两个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18265650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com