我将 a 传递data.frame给一个使用 对其进行排序的函数data.table::setorder。在排序之前,我正在调用data.table::setDT输入(实际上我需要稍后data.table在输入上调用一些特定函数)。这是我正在使用的功能:
test_order <- function(x) {
data.table::setDT(x)
data.table::setorder(x, score)
}
Run Code Online (Sandbox Code Playgroud)
我就是这样称呼它的:
x0 <- data.frame(id = 1:3, score = c(20, 10, 30))
x1 <- test_order(x0)
Run Code Online (Sandbox Code Playgroud)
结果看起来很奇怪:
x0改为a data.table- 看起来还可以;x0$id未修改- 它的地址(使用)保持不变,并且也保持原始顺序;data.table::addressx0$score也保留在相同的地址,但现在已排序,因此它与列不同步id;x1行排序正确;此外,该列与的列score位于同一地址,但该列当然位于不同的地址。这是我得到的:scorex0id> x0
id score
1 1 20
2 2 10
3 3 30
> x1 <- test_order(x0)
> x0
id score
1: 1 10
2: 2 20
3: 3 30
> x1
id score
1: 2 10
2: 1 20
3: 3 30
Run Code Online (Sandbox Code Playgroud)
最“令人惊讶”的事情是对象的数据完整性丢失x0-id列保持原始顺序但score列已排序,因此行与原始对象的行不同。如果我没有调用setDT或者传递一个data.table对象而不是data.frame.
软件包的版本data.table是1.14.2
| 归档时间: |
|
| 查看次数: |
400 次 |
| 最近记录: |