通过将变量与条件分组来对data.table进行排序

时间:2019-12-08 10:19:31

标签: r sorting data.table grouping

我有以下data.table(实际上我的data.table更大(更多的组和更多的其他变量)):

Data <- data.table(Group = rep(c("a", "b"), each = 3),
                   Var = 1:6)

> print(Data)
   Group Var
1:     a   1
2:     a   2
3:     a   3
4:     b   4
5:     b   5
6:     b   6

现在,我想基于变量data.tableGroup进行排序,但前提是Group == "a"。 我的糟糕尝试如下:

> Data[Group == "a", .SD[.N:1]]
   Group Var
1:     a   3
2:     a   2
3:     a   1

我知道为什么这是错误的,但我想不出一种解决方案,可以达到我想要的输出:

   Group Var
1:     a   3
2:     a   2
3:     a   1
4:     b   4
5:     b   5
6:     b   6

2 个答案:

答案 0 :(得分:3)

您的尝试将适用于

library(data.table)
Data[Group == "a"] <- Data[Group == "a", .SD[.N:1]]
Data
#    Group Var
#1:     a   3
#2:     a   2
#3:     a   1
#4:     b   4
#5:     b   5
#6:     b   6

但是,如果您想根据Var以降序对行进行排序,则以上只是对行进行了反转

Data[Group == "a"] <- Data[Group == "a", .SD[order(-Var)]]

如果您有多列,则可以

cols <- c("a", "b")
Data[Group %in% cols] <- Data[Group %in% cols,.SD[order(-Var)],Group]

使用data.table的更好方法是按照@markus的建议通过引用进行更新

Data[Group %in% cols, Var := .SD[order(-Var)]$Var]

答案 1 :(得分:2)

不使用.SD表示法:

> Data[Group == "a", Var := sort(Var, decreasing = TRUE)]
> Data

   Group Var
1:     a   3
2:     a   2
3:     a   1
4:     b   4
5:     b   5
6:     b   6

由于data.table较大且组较多,因此您可能希望考虑使用.I表示法(请参阅article@nathaneastwood),因为这样做会导致在某些情况下表现更好。在这里,.I将标识感兴趣的行号。让我们更改示例,以便我们对两个组感兴趣:

Data <- data.table(Group = rep(c("a", "b", "c"), each = 3), Var = 10:18)

然后:

> Data[Data[, .I[Group  %in% c("a", "c")]], Var := sort(Var, decreasing = TRUE), by = Group]

> Data
   Group Var
1:     a  12
2:     a  11
3:     a  10
4:     b  13
5:     b  14
6:     b  15
7:     c  18
8:     c  17
9:     c  16

为完整起见,基本思想包含在以下内容中:

Data[Group %in% c("a", "c"), Var:= sort(Var, decreasing = TRUE), by = Group]