Я нуждаюсь в том, чтобы знать, как делать в 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.
Давайте определять сначала:
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), но - решение ;).
Привет,
Если ты приучен для 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