gpt4 book ai didi

r - 从 R 中的每个组中选择不同数量的元素

转载 作者:行者123 更新时间:2023-12-02 06:50:41 26 4
gpt4 key购买 nike

我正在参加 Kaggle Instacart 竞赛,但我对 R 还很陌生,遇到了一些我想不通的事情。

我有一个包含 4 列的数据集。第一列是订单 ID (id1)。第二列是产品 ID (id2)。第三列是我想从订单 id1 中选择产品 id2 的概率,我们可以将其视为排名,因此总是选择较高的概率而不是较小的概率。最后,第四列是我要从给定订单中选择的产品数量(订单的一个特征)。因此,例如,我这里有数据框 df 的前 12 行:

        id1        id2       prob       num
1 17 13107 0.4756982 3
2 17 21463 0.3724126 3
3 17 38777 0.3534422 3
4 17 21709 0.3364623 3
5 17 47766 0.3364623 3
6 17 39275 0.3165896 3
7 34 16083 0.4093785 4
8 34 39475 0.3892882 4
9 34 47766 0.3892882 4
10 34 2596 0.3837562 4
11 34 21137 0.3762758 4
12 34 47792 0.3737032 4

我们可以看到,从 id1 = 17 我想选择 3 个元素,而对于 id1 = 34 我想选择 4 个元素。结果应该是

ID1     ID2
17 13107, 21463, 38777
34 16083, 39475, 47766, 2596

或类似的东西。

目前我已经尝试使用

df %>% group_by(id1) %>% top_n(n = num)

但是我得到了错误

Selecting by num
Error in is_scalar_integerish(n) : object 'num' not found

有人知道我会怎么做吗?

谢谢

最佳答案

您可以将分组数据直接通过管道传输到 summarise 语句中:

df %>% group_by(id1) %>% summarise(id2 = toString(id2[seq_len(first(num))]))
## A tibble: 2 x 2
# id1 id2
# <int> <chr>
#1 17 13107, 21463, 38777
#2 34 16083, 39475, 47766, 2596

在此语句中,id2[seq_len(first(num))] 用于提取每个组的第一个 num,创建一个从 1 到 num 并且该序列用于对前 X 个 id2 值进行子集化。

toString 为每个 id1 组创建一个字符串。


这是另一个使用 aggregate 的基本 R 选项:

aggregate(id2 ~ id1, FUN=toString, subset(df, ave(id1, id1, FUN=seq_along) <= num))
# id1 id2
#1 17 13107, 21463, 38777
#2 34 16083, 39475, 47766, 2596

请注意,我假设数据已经按递减概率排序(如示例中所示)。

关于r - 从 R 中的每个组中选择不同数量的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45306111/

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