Не думаю, что это то, что мне было нужно раньше.Обычно лучше не полагаться на порядок столов.Лишь в тех случаях, когда я полагаюсь на это, порядок будет содержаться внутри функции, т. Е. Функция B не будет зависеть от порядка, который происходит в функции A.
Я думаю, что это делает то, что вы просите, используяdata.table
пакет.Вы устанавливаете ключи с помощью этого пакета, и они упорядочены слева направо с точки зрения первичного, вторичного ключа и т. Д. Я не уверен, что объединение ключей вместе - это лучший способ, но он простой.
# reproducible fake data
library(data.table)
set.seed(1)
dt <- data.table(a=rep(1:5, 2), b=letters[1:10], c=sample(1:3, 10, TRUE))
# scramble
dt <- dt[sample(1:.N)]
# make the ideal structure
keys <- c("a", "b")
dt_ideal <- copy(dt)
dt_ideal <- setkeyv(dt_ideal, keys)
key(dt_ideal)
# function to find keys not the same for each row. Pasting together
findBad <- function(dt, dt_ideal){
not_ok <- which(dt_ideal[, do.call(paste, c(.SD, sep=">")), .SDcols=keys] !=
dt[, do.call(paste, c(.SD, sep=">")), .SDcols=keys])
not_ok
}
# index of bad rows - all bad in this case
not_ok <- findBad(dt, dt_ideal)
dt[not_ok]
# better eg, swap 7 & 8
dt2 <- copy(dt_ideal)
dt2 <- dt2[c(1:6, 8, 7, 9:10)]
not_ok <- findBad(dt2, dt_ideal)
dt2[not_ok]