gpt4 book ai didi

R:在 j 子句中的 cut 函数中引用 data.table 字段

转载 作者:行者123 更新时间:2023-12-03 01:40:55 25 4
gpt4 key购买 nike

基本上,我有以下 2 个 data.table:

dt - 包含值字段 (y) 和分组字段 (x)
bk - 包含 4 个“break”字段 (bn),描述每个组 x 的区间 [1, inf) 的桶结构dt 中找到。每个 bn 代表该存储桶的最小值(含),并延伸到下一个存储桶(例如:x=1 的 4 个存储桶为 [1,3),[ 3,5), [5, 10), [10, inf))。 注意桶结构不一定是唯一的。

> #4 groups (x), each with a bucket structure defined breaks (bn).
> bk<- data.table(x=c(1:4), b1=c(1,1,1,1), b2=c(3,3,4,4), b3=c(5,5,7,8), b4=c(10,10,10,10), key="x")
> bk
x b1 b2 b3 b4
1: 1 1 3 5 10
2: 2 1 3 5 10
3: 3 1 4 7 10
4: 4 1 4 8 10
> dt<- data.table(x=rep(c(1:4),5), y=rep(c(1:10),2), key="x")
> dt
x y
1: 1 1
2: 1 5
3: 1 9
4: 1 3
5: 1 7
6: 2 2
7: 2 6
8: 2 10
9: 2 4
10: 2 8
11: 3 3
12: 3 7
13: 3 1
14: 3 5
15: 3 9
16: 4 4
17: 4 8
18: 4 2
19: 4 6
20: 4 10

我的目标是在 dt 中添加一个字段 b 来根据存储桶结构指示记录属于哪个存储桶(1、2、3 或 4)对应于组x。请参阅下面所需的输出:

    x  y  b
1: 1 1 1 #Buckets for x=1
2: 1 5 3
3: 1 9 3
4: 1 3 2
5: 1 7 3
6: 2 2 1 #Buckets for x=2 (same as 1)
7: 2 6 3
8: 2 10 4
9: 2 4 2
10: 2 8 3
11: 3 3 1 #Buckets for x=3
12: 3 7 3
13: 3 1 1
14: 3 5 2
15: 3 9 3
16: 4 4 2 #Buckets for x=4
17: 4 8 3
18: 4 2 1
19: 4 6 2
20: 4 10 4

我最初的想法是连接两个 data.table 并使用 cut 函数返回每条记录的存储桶编号,但是我遇到了问题打破参数。第一次尝试如下所示:

> bkt[dt, .(x, y, b=cut(y, breaks=c(b1, b2, b3, b4, "inf"), include.lowest=TRUE, labels=c(1:4)))]
Error in cut.default(y, breaks = c(b1, b2, b3, b4, "inf"), include.lowest = TRUE, :
'breaks' are not unique

如果我创建一个变量 a 来保存存储桶结构(例如,对于 x=1),则以下内容将按我的预期工作:

> a<- c(1, 3, 5, 10, "inf")
> bkt[dt, .(x, y, b=cut(y, breaks=a, include.lowest=TRUE, labels=c(1:4)))]
x y b
1: 1 1 1
2: 1 5 2
3: 1 9 3
4: 1 3 1
5: 1 7 3
6: 2 2 1
7: 2 6 3
8: 2 10 3
9: 2 4 2
10: 2 8 3
11: 3 3 1
12: 3 7 3
13: 3 1 1
14: 3 5 2
15: 3 9 3
16: 4 4 2
17: 4 8 3
18: 4 2 1
19: 4 6 3
20: 4 10 3

对于我的应用程序来说,这仍然不是一个实用的解决方案,但我希望有人可以帮助我了解如何正确地将存储桶结构信息传递给 breaks 参数以获得类似的结果。我尝试了 clistunlistas.numeric 函数的各种组合来传递正确的 break 论点但没有运气。任何帮助/见解将不胜感激。谢谢!

全面披露,我是 R 新手,这是我的第一篇文章,请保持温柔。

最佳答案

稍微改变一下连接语法:

dt[bk, v := 
cut(y, breaks = c(b1, b2, b3, b4, Inf), include.lowest = TRUE, labels = 1:4)
, by=.EACHI]

x y v
1: 1 1 1
2: 1 5 2
3: 1 9 3
4: 1 3 1
5: 1 7 3
6: 2 2 1
7: 2 6 3
8: 2 10 3
9: 2 4 2
10: 2 8 3
11: 3 3 1
12: 3 7 2
13: 3 1 1
14: 3 5 2
15: 3 9 3
16: 4 4 1
17: 4 8 2
18: 4 2 1
19: 4 6 2
20: 4 10 3

这些结果与OP中所需的输出不同,但我认为错误在于对cut参数的解释(我觉得这很令人困惑)。

这种方法相当不优雅,因为每个 b1, ..., b4 都必须写入;并且随着断点的增加,它的扩展性也不会很好。我同意 @NathanWerth reshape bk 表的建议。他的方法还给出了 OP 期望的结果,而无需摆弄 cut 参数。

<小时/>

旁注:正确的符号是 Inf 而不是 "inf"

关于R:在 j 子句中的 cut 函数中引用 data.table 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45357928/

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