R: Как упорядочивать dataframes на основании вектора индексов колонн?

Я нуждаюсь в том, чтобы знать, как делать в R чтобы для упорядочивать восходи frame из-за колонн используя вектор, который показывает число колонны, из-за которой я хочу упорядочить. У меня есть следующий data.frame:

df<-data.frame(a=c(1,1,2,3,4),b=c(1,2,3,4,4),c=c(1,1,2,1,3),d=c(4,2,3,1,2))

и вектор z, что может меняться размера, и что показывает мне последовательность и индекс колонн, который нужно упорядочивать, из-за ej, если z <-c (2,4) значит, что я хочу упорядочить сначала из-за колонны 2 ("b") и потом из-за колонны 4 ("d"). Для этого случая дата frame аккуратный дала бы как результат:

a   b   c   d
3   4   1   1
1   2   1   2
4   4   3   2
2   3   2   3
1   1   1   4

В случае, который был z <-c (1,4,2) был бы:

a   b   c   d
1   1   1   4
1   2   1   2
2   3   2   3
3   4   1   1
4   4   3   2

Вышеупомянутый случай я могу решать это следующей формы:

df [order (df [1], df [4], df [2])]

Однако как длина вектора z смоги меняться, я нуждаюсь в форме стиля df [order (z)] (что не функционирует), для того, чтобы упорядочил dataframe как стоимость, которые может приносить вектор z.

4
задан 01.07.2016, 17:04
2 ответа

Давайте определять сначала:

dford1 <- df[order(df[ ,1],df[ ,4],df[ ,2]), ]

Решение - используя функцию arrange_ (с _) пакета dplyr. Сначала, что все существует функция arrange которая упорядочивает согласно предоставленным колоннам:

library(dplyr)
dford2 <- arrange(df, a, d, b)

Однако, равно как первая, нуждается ясно в аргументах. Но существуй arrange_ что реализует то же самое, но аргумент (string) - имена колонн используя аргумент .dots:

dford3 <- arrange_(df, .dots = c("a", "d", "b"))

С предыдущим ты можешь использовать индексы, вектор z, чтобы извлекать имена, которых ты требуешь:

z <- c(1, 4, 2)
dford4 <- arrange_(df, .dots = names(df)[z])

> dford4
  a b c d
1 1 2 1 2
2 1 1 1 4
3 2 3 2 3
4 3 4 1 1
5 4 4 3 2

Функция, может быть, вначале не является такой интуитивной по имени аргумента (.dots), но - решение ;).

Привет,

3
ответ дан 24.11.2019, 13:57
  • 1
    Большое спасибо, было справедливым то, в чем он нуждался –  Eric Hofmann 04.07.2016, 17:31

Если ты приучен для SQL, ты можешь использовать пакет sqldf чтобы упорядочивать дату frames:

library(sqldf)
df<-data.frame(a=c(1,1,2,3,4),b=c(1,2,3,4,4),c=c(1,1,2,1,3),d=c(4,2,3,1,2))
z <- c(2,4)
sqldf(paste("select * from df order by ", paste(colnames(df)[z], collapse=','), collapse=' '))
##   a b c d
## 1 1 1 1 4
## 2 1 2 1 2
## 3 2 3 2 3
## 4 3 4 1 1
## 5 4 4 3 2
z <- c(4,1,3)
sqldf(paste("select * from df order by ", paste(colnames(df)[z], collapse=','), collapse=' '))
##   a b c d
## 1 3 4 1 1
## 2 1 2 1 2
## 3 4 4 3 2
## 4 2 3 2 3
## 5 1 1 1 4
1
ответ дан 24.11.2019, 13:57

Теги

Похожие вопросы