gpt4 book ai didi

r - 在R中,如何按data.table中的特定值对列进行排序?

转载 作者:行者123 更新时间:2023-12-02 17:52:42 25 4
gpt4 key购买 nike

假设我在 data.table 中有这样的列:

抱歉,我第一次没有具体说明。每个值都属于一个项目代码。该代码将重复多次,因为这些项目属于一个系列。有些项目具有值 a,b,c,有些具有 a,b,c,d,有些具有 a,b,有些仅具有b.

 family item value
1 001 01 a
2 001 01 b
3 001 01 c
4 001 02 b
5 001 05 b
6 001 32 a
7 001 32 b
8 001 32 c
9 001 32 d
10 002 01 a
11 002 01 b
12 002 01 c
13 002 32 b
14 002 55 b

如何通过将 b 放在每个项目的前面来对列进行排序?如b,a,cb,a,c,db,ab。排序后的列应该是这样的:

family item value id
1 001 01 b 1
2 001 01 a 1
3 001 01 c 1
4 001 02 b 2
5 001 05 b 3
6 001 32 b 4
7 001 32 a 4
8 001 32 c 4
9 001 32 d 4
10 002 01 b 5
11 002 01 a 5
12 002 01 c 5
13 002 32 b 6
14 002 55 b 7

data.table包中有setorder()和setorderv(),但是两者都只能按列排序。具体值怎么样?

最佳答案

假设您的 data.table 名为“DT”,列名称为“V1”和“V2”,请尝试以下操作:

DT[, V2 := factor(V2, c("b", setdiff(unique(V2), "b")))][order(V1, V2)]
# V1 V2
# 1: 1 b
# 2: 1 a
# 3: 1 c
# 4: 2 b
# 5: 3 b
# 6: 4 b
# 7: 4 a
# 8: 4 c
# 9: 4 d
<小时/>

更新

使用新的示例数据,尝试以下操作:

DT[, id := .GRP, by = list(family, item)][, value := factor(
value, c("b", setdiff(unique(value), "b")))][order(id, value)]
# family item value id
# 1: 1 1 b 1
# 2: 1 1 a 1
# 3: 1 1 c 1
# 4: 1 2 b 2
# 5: 1 5 b 3
# 6: 1 32 b 4
# 7: 1 32 a 4
# 8: 1 32 c 4
# 9: 1 32 d 4
# 10: 2 1 b 5
# 11: 2 1 a 5
# 12: 2 1 c 5
# 13: 2 32 b 6
# 14: 2 55 b 7
<小时/>

上面的答案非常好(而且更笼统)。针对这种特殊情况,我们也可以这样做。我们只需创建一个 b 值较小的整数列,然后使用 setorder 按引用对行重新排序,如下所示:

DT[, id := 1L][value == "b", id := 0L] 
setorder(DT, family, item, id)[, id := NULL] # don't need 'id' after ordering
# family item value
# 1: 1 1 b
# 2: 1 1 a
# 3: 1 1 c
# 4: 1 2 b
# 5: 1 5 b
# 6: 1 32 b
# 7: 1 32 a
# 8: 1 32 c
# 9: 1 32 d
# 10: 2 1 b
# 11: 2 1 a
# 12: 2 1 c
# 13: 2 32 b
# 14: 2 55 b

关于r - 在R中,如何按data.table中的特定值对列进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26241957/

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