我有以下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.table
对Group
进行排序,但前提是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
答案 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]