Рассмотрим таблицу data.table ниже:
DT <- data.table(a=c(1,2,4,3,5), b=c(3:5,NA,2), c=c(2,1,NA,NA,3))
DT
a b c
1: 1 3 2
2: 2 4 1
3: 4 5 NA
4: 3 NA NA
5: 5 2 3
Я хочу отсортировать строки на основе 3-го столбца, а затем 1-го столбца. Я могу сделать это, используя:
DT[order(DT[,3],DT[,1])]
a b c
1: 2 4 1
2: 1 3 2
3: 5 2 3
4: 3 NA NA
5: 4 5 NA
Но если в DT много столбцов и, допустим, я хочу отсортировать их по столбцам с 1-го по i-й, то записать его как:
DT[order(DT[,1], DT[,2], DT[,3], ... DT[,i])]
Вместо этого я хотел бы предоставить индексы столбцов в виде вектора (см. Ниже):
DT[order(DT[,c(1:i)])]
Но это не работает так, как я ожидал, и результат:
DT[order(DT[,c(3,1)])]
a b c
1: 2 4 1
2: NA NA NA
3: 1 3 2
4: NA NA NA
5: 5 2 3
6: NA NA NA
7: NA NA NA
8: NA NA NA
9: 4 5 NA
10: 3 NA NA
Любой совет, как я могу это исправить? Спасибо!
Спасибо, @Henrik! setorderv сработал для меня: col <-names (DT) [c (3,1)], а затем setorderv (DT, col, c (1,1)) Однако он помещает значения NA поверх. Есть ли у нас возможность решить, что они окажутся наверху или внизу?
Вы нашли время, чтобы прочитать ?setorderv
?
О, я вижу! есть возможность сказать «na.last = TRUE» Спасибо, @Henrik!
Мы можем использовать do.call
с order
после указания .SDcols
DT[DT[,do.call(order, .SD), .SDcols = c(3, 1)]]
# a b c
#1: 2 4 1
#2: 1 3 2
#3: 5 2 3
#4: 3 NA NA
#5: 4 5 NA
Проверьте
setorderv
, как описано в ответе здесь: Как отсортировать фрейм данных по нескольким столбцам?. Для ряда столбцов, напримерcols <- names(iris)[2:4]
;setorderv(iris, cols)