난 로렌아줌마가 다다드프라임 정렬하려면 여러 사람이 열. 예를 들어, 아래에 있는 다다드프라임 싶다 '' b 'z' (내림차순을) 을 열별 정렬하려면 열별 (올림차순):
dd <- data.frame(b = factor(c("Hi", "Med", "Hi", "Low"),
levels = c("Low", "Med", "Hi"), ordered = TRUE),
x = c("A", "D", "A", "C"), y = c(8, 3, 9, 9),
z = c(1, 1, 1, 2))
dd
b x y z
1 Hi A 8 1
2 Med D 3 1
3 Hi A 9 1
4 Low C 9 2
['주문 ()'] 기능을 사용할 수 있습니다 (http://stat.ethz.ch/R-manual/R-devel/library/base/html/order.html) 에 의존하지 않고 직접 사용하는 것이 바로 이 슬라이드에서는 오토메이티드 간단해진다는 추가 도구 - 맨 위에 '예 (주문)' 코드:
R> dd[with(dd, order(-z, b)), ]
b x y z
4 Low C 9 2
2 Med D 3 1
1 Hi A 8 1
3 Hi A 9 1
R> dd[order(-dd[,4], dd[,1]), ]
b x y z
4 Low C 9 2
2 Med D 3 1
1 Hi A 8 1
3 Hi A 9 1
R>
열의 이름을 사용하지 않고 (() '와' 로 더 쉽게 / direct access).
대부분의 시간을 갖는 '또는' 한 '이' 드프리르 콩지름에 데이타스터블 솔루션을 사용하여 '인데,' 기본 오더할 아니 종속물과의 중요하다.
난 최근에 추가된 패키지 수 있기 때문에 소t.다다드프라임 크랑 클래스용 호환적 설명한 바와 같이 있습니다. https://stackoverflow.com/questions/6836963/best-way-to-create-generic-method-consistency-for-sort-data-frame
따라서 다음과 같이 주어진 다다드프라임 dd 정렬할 수 있습니다.
dd <- data.frame(b = factor(c("Hi", "Med", "Hi", "Low"),
levels = c("Low", "Med", "Hi"), ordered = TRUE),
x = c("A", "D", "A", "C"), y = c(8, 3, 9, 9),
z = c(1, 1, 1, 2))
library(taRifx)
sort(dd, f= ~ -z + b )
이 함수의 경우, 원래 한 작가, 제발 연락 부탁드립니다. 토론으로 도메니니스 바로 여기에 있다. http://chat.stackoverflow.com/transcript/message/1094290 # 1094290
'기능을 사용할 수도 있습니다 ()' 에서 '위' 를 해들리 배열합니다 프라이어 스레드할 지적했다.
library(plyr)
arrange(dd,desc(z),b)
벤치마크: 참고로 난 이후 각 패키지당 로드되었는지 새 R 세션용으로 많은 갈등이 있었다. 특히 이 도비 패키지 '가' 로드중 정렬하려면 반환되기를 " 마스킹됨 & # 39 객체에는) 가, 다음, & # 39, x (포지셔닝하십시오 (17): b, x, y, 패키지 '는' 에서 케빈 라이트, 로딩 z" 데듀시르 덮어씁니다 소t.다다드프라임 또는 다리프스 패키지.
#Load each time
dd <- data.frame(b = factor(c("Hi", "Med", "Hi", "Low"),
levels = c("Low", "Med", "Hi"), ordered = TRUE),
x = c("A", "D", "A", "C"), y = c(8, 3, 9, 9),
z = c(1, 1, 1, 2))
library(microbenchmark)
# Reload R between benchmarks
microbenchmark(dd[with(dd, order(-z, b)), ] ,
dd[order(-dd$z, dd$b),],
times=1000
)
마드얀의 시간:
'dd [함께 (dd, 주문 (z, b))]' 778
'dd [순서 (z, dd $ $ dd b),]' 788
library(taRifx)
microbenchmark(sort(dd, f= ~-z+b ),times=1000)
마드얀의 시간: 1,567
library(plyr)
microbenchmark(arrange(dd,desc(z),b),times=1000)
마드얀의 시간: 862
library(doBy)
microbenchmark(orderBy(~-z+b, data=dd),times=1000)
마드얀의 시간: 1,694
단, 도비 좋은 시간 걸리는 약어입니다 로드하기에 숨겨요.
library(Deducer)
microbenchmark(sortData(dd,c("z","b"),increasing= c(FALSE,TRUE)),times=1000)
esort <- function(x, sortvar, ...) {
attach(x)
x <- x[with(x,order(sortvar,...)),]
return(x)
detach(x)
}
microbenchmark(esort(dd, -z, b),times=1000)
m <- microbenchmark(
arrange(dd,desc(z),b),
sort(dd, f= ~-z+b ),
dd[with(dd, order(-z, b)), ] ,
dd[order(-dd$z, dd$b),],
times=1000
)
uq <- function(x) { fivenum(x)[4]}
lq <- function(x) { fivenum(x)[2]}
y_min <- 0 # min(by(m$time,m$expr,lq))
y_max <- max(by(m$time,m$expr,uq)) * 1.05
p <- ggplot(m,aes(x=expr,y=time)) + coord_cartesian(ylim = c( y_min , y_max ))
p + stat_summary(fun.y=median,fun.ymin = lq, fun.ymax = uq, aes(fill=expr))
(,) 은 어퍼 사분위수 충스러웠으니 쇱そ 사분위수 흐름선 확장하십시오 joyon. 마드얀의)
특히 이 결과를 놓고 사용 및 속도, I&; d # 39 를 '를 해야 vs. 배열합니다 지지자가 상대방 주자가 후보가 됐을 때' 패키지 '를' 프라이어 . 이 회사는 아직 거의 같은 간단한 문법을 기반으로 빠른 스피드를 앞세워 및 R 명령의세 뒤얽힌 음모. 일반적으로 선명한 해들리 위컴 작동합니까. 이를 통해 정렬 객체에는 브레이크가 표준 R nomenclature, 복통, 이것만이 나의 것이 있는 이유에 대해 해들리 (객체) '에서' 라는 확보하십시오 정렬하려면 하지만 난 그것을했다 이쪽요 문제로 링크됨 위에 설명한 질문.
## The data.frame way
dd[with(dd, order(-z, b)), ]
## The data.table way: (7 fewer characters, but that's not the important bit)
dd[order(-z, b)]
주로 작은 차이는 있지만, 두 차례 통화 중요한 각오하랬지 있을 수 있습니다. 특히 운영 코드를 작성하는 경우, 해당 분야의 연구 및 / 또는 대해 걱정하고 있습니다 # 39 의 불필요한 반복을 피하기 위해 남편과 it& 베스트중에 변수 이름. '데이타스터블' 이렇게 할 수 있습니다.
quarterlyreport[with(quarterlyreport,order(-z,b)),]
알았어. 아무것도아니야 어때서. # 39 의 보고서가 지난 다음 상사를 quarter& 보고서에 포함시킬 것을 요구합니다. You go) '에서' 라스트쿼터리어포트 코드에 추가하여 객체에는 통해 여러 곳 및 짐작이지만요. (어떻게 대지위의?) 대체하십시오 끝날 수 있습니다.
quarterlyreport[with(lastquarterlyreport,order(-z,b)),]
'데이타스터블' 에서 # 39, 이런 작은 세부내용에서 we& re 않을까 우려하고 있다. 그래서 we& # 39, 입력 변수 이름을 피할 수 있는 단순한 사안이 ve done 주택복권에 당첨되셨다고요? 뭔가 아주 간단합니다. dd '의' i ',' 프레임 내의 검사됩니다 이미 자동으로. # 39 () '에 있는' t need 다란다 don& 있습니다.
대신
dd[with(dd, order(-z, b)), ]
dd[order(-z, b)]
대신 및
quarterlyreport[with(lastquarterlyreport,order(-z,b)),]
quarterlyreport[order(-z,b)]
여기에 대답을 많다, 하지만 뛰어난 [드프리르] (http://github.com/hadley/dplyr) 를 통해 내가 할 수 있는 유일한 구문을 쉽고 빠르게 너희에게베풀어진 (및 이제 자주 사용).
library(dplyr)
# sort mtcars by mpg, ascending... use desc(mpg) for descending
arrange(mtcars, mpg)
# sort mtcars first by mpg, then by cyl, then by wt)
arrange(mtcars , mpg, cyl, wt)
arrange(dd, desc(z), b)
b x y z
1 Low C 9 2
2 Med D 3 1
3 Hi A 8 1
4 Hi A 9 1
첫째, ll, 다른 방법 및 벤치마트 we& # 39 에서 언급한 후 다른 답변을 볼 만큼 데이터세트를 생성하시겠습니까 나열하십시오 기능을 data.table *
require(plyr)
require(doBy)
require(data.table)
require(dplyr)
require(taRifx)
set.seed(45L)
dat = data.frame(b = as.factor(sample(c("Hi", "Med", "Low"), 1e8, TRUE)),
x = sample(c("A", "D", "C"), 1e8, TRUE),
y = sample(100, 1e8, TRUE),
z = sample(5, 1e8, TRUE),
stringsAsFactors = FALSE)
이러한 기능을 시스템스타임 (.) '에' 를 실행하여 타이밍 보고됨 있다 (아래 참조). 타이밍 방향벡터 아래 () 로 가장 빠른 순으로 최저속) 있다.
orderBy( ~ -z + b, data = dat) ## doBy
plyr::arrange(dat, desc(z), b) ## plyr
arrange(dat, desc(z), b) ## dplyr
sort(dat, f = ~ -z + b) ## taRifx
dat[with(dat, order(-z, b)), ] ## base R
# convert to data.table, by reference
setDT(dat)
dat[order(-z, b)] ## data.table, base R like syntax
setorder(dat, -z, b) ## data.table, using setorder()
## setorder() now also works with data.frames
# R-session memory usage (BEFORE) = ~2GB (size of 'dat')
# ------------------------------------------------------------
# Package function Time (s) Peak memory Memory used
# ------------------------------------------------------------
# doBy orderBy 409.7 6.7 GB 4.7 GB
# taRifx sort 400.8 6.7 GB 4.7 GB
# plyr arrange 318.8 5.6 GB 3.6 GB
# base R order 299.0 5.6 GB 3.6 GB
# dplyr arrange 62.7 4.2 GB 2.2 GB
# ------------------------------------------------------------
# data.table order 6.2 4.2 GB 2.2 GB
# data.table setorder 4.5 2.4 GB 0.4 GB
# ------------------------------------------------------------
',' & # 39 데이타스터블 dt/ s '는 ~ [주문 (.)]' 구문을 보다 10 배 빠른 반면 동일한 양의 메모리를 사용하는 다른 방법 ('드프리르') 로 '드프리르'.
',' & # 39 데이타스터블 세트러더 s ' ()' 는 ~ 14x 보다 다른 가장 빠른 방법 ('드프리르') 그냥 0.4GB 참여하는 동안 추가 메모리를. 이제 우리가 할 수 있는 '' dat 주문하십시오 때처럼 업데이트되도록 참조별로).
Speed:*
[주문 (.)] '' dt/ 구문을 사용하여 # 39 의 빠른 오더할 data.table* 최적화됩니다 내부적으로 잘 알려져 있다. 하지만 익숙한 기본 R 구문을 사용하여 프로세스 속도를 유지할 수 있습니다 (및 사용 적은 메모리).
Memory:*
, T, 우리는 대부분의 시간을 필요로 하는 don& 다다드프라임 데이타스터블 * # 39 는 원본 또는 후에 순서재정리. 즉, 우리 보통 할당하십시오 뒤로를 결과 동일한 객체 (예:
DF, DF - < [순서 (.)]
문제는 이 과정에서 최소한 두 번 (2x) 메모리가 원래 오브젝트도. , 데이타스터블 수 있어 효율적인 메모리 '는 또한 함수은 세트러더 ()'.
데이타스타바레스 참조별로 재배열합니다 세트러더 () '' ',' ( 내부 *) 없이 추가 복제본에. 추가 메모리를 사용하여 동일한 크기의 1 열 뿐이다.
다른 features:*
>. 참고로 ',' ',' 촉각 '팩터에서의 데이트였어 포식스. 숫자 '유형' 정수 '/' 클래스뿐만 모두 함께 사용할 수 있으며, 그 때문에 추가 속성을 잘 알려져 있다.
그러나 데이타스터블 , just do we can, 예를 들어, 'dat [순서 (x)]' 또는 '세트러더 (dat, - x)'.
[1] 와 [이 (아주 도움됐네) 기능을 통해 케빈 라이트], wiki, R 이 실린 팁을 섹선에서 쉽게 달성했다.
sort(dd,by = ~ -z + b)
# b x y z
# 4 Low C 9 2
# 2 Med D 3 1
# 1 Hi A 8 1
# 3 Hi A 9 1
[1]: //rwiki.sciviews.org/doku.php tips% 3adata-frames% 3asort? id = https://web.archive.org/web/20131108055534/http
'' A ',' 운영까지도 정렬하려면 다다드프라임 있다고 가정해 봅시다 '열' x '를 사용하여 해당 불렀으매 내림차순을 주문. Security. 정렬할지 다다드프라임 뉴다타 '' ''
newdata <- A[order(-A$x),]
스케쳐내 굈 ',' 올림차순 어졌다면 주문하십시오 " - " 조끼말고는 아무것도. 같은 뭔가를해야합니다 수 있습니다.
newdata <- A[order(-A$x, A$y, -A$z),]
여기서 'x' 와 'z' '' A '' 다다드프라임 단 몇 가지 있다. 즉, 'x', 'y' 정렬 '다다드프라임' 에서 'A' 와 'z' 내림차순을 올림차순 내림차순을.
그러면 내가 배웠던 '주문' 을 (를) 다음 예제에서는 너무 오랫동안 나를.
set.seed(1234)
ID = 1:10
Age = round(rnorm(10, 50, 1))
diag = c("Depression", "Bipolar")
Diagnosis = sample(diag, 10, replace=TRUE)
data = data.frame(ID, Age, Diagnosis)
databyAge = data[order(Age),]
databyAge
이 때문에 단 하나의 이유는 '예' 는 벡터) 시대 '가 아닌' 는 정렬 순서 '시대' 에 의해 열이 '데이터 프레임을 데이터'.
동일한 데이터를 사용하여 만들 수 있는 '프레임' 이 슬라이드에서는 레더스터블 위의 벡터 약간 다른 열 이름을 사용하지 않고 있다.
my.data <- read.table(text = '
id age diagnosis
1 49 Depression
2 50 Depression
3 51 Depression
4 48 Depression
5 50 Depression
6 51 Bipolar
7 49 Bipolar
8 49 Bipolar
9 49 Bipolar
10 49 Depression
', header = TRUE)
위의 선 구조를 '주문' 더 이상 작동하지 않는 벡터입니다 없기 때문에 이름이 '시대'.
databyage = my.data[order(age),]
'다음' 에서 '열' 선 '에 있기 때문에 작동됨 주문하십시오 신규인지 기간보다오래된 미스다타'.
databyage = my.data[order(my.data$age),]
이 때 나는 이 글을 어떻게 생각해봤죠 가치는 너무 오랫동안 예제에서와 두고 있었다. 내가 할 수 없는 경우 이 게시물에 대한 분리하십시오 스레드할 결정하게 된다.
다음은 길을 열 이름을 지정하지 않고 모든 열에 의해 일반 데이터 프레임을 정렬. 아래 코드는 왼쪽에서 오른쪽으로 사용하거나 오른쪽에서 왼쪽으로 정렬하려면 방법을 보여줍니다. 이 경우 모든 열이 작동됨 숫자. 난 아직 문자로 열 했다 "고 덧붙였다.
한두 달 전부터 코드 a 에서 i found 도스콜 '이' 늙은 포스트에 뿐 다른 사이트를 검색 후 광범위하고 어렵다. 나는 이제 어떻게 할 수 있는 재배치합니다 게시물로의 확실하지 않다. 현재 '에서' R 'a' 는 오더할 다다드프라임 스레드할 처음 나왔다. 당초 '코드' 내 확장됨 버전에 따라서 생각해봤죠 도스콜 유용할 수 있습니다.
set.seed(1234)
v1 <- c(0,0,0,0, 0,0,0,0, 1,1,1,1, 1,1,1,1)
v2 <- c(0,0,0,0, 1,1,1,1, 0,0,0,0, 1,1,1,1)
v3 <- c(0,0,1,1, 0,0,1,1, 0,0,1,1, 0,0,1,1)
v4 <- c(0,1,0,1, 0,1,0,1, 0,1,0,1, 0,1,0,1)
df.1 <- data.frame(v1, v2, v3, v4)
df.1
rdf.1 <- df.1[sample(nrow(df.1), nrow(df.1), replace = FALSE),]
rdf.1
order.rdf.1 <- rdf.1[do.call(order, as.list(rdf.1)),]
order.rdf.1
order.rdf.2 <- rdf.1[do.call(order, rev(as.list(rdf.1))),]
order.rdf.2
rdf.3 <- data.frame(rdf.1$v2, rdf.1$v4, rdf.1$v3, rdf.1$v1)
rdf.3
order.rdf.3 <- rdf.1[do.call(order, as.list(rdf.3)),]
order.rdf.3
이에 대해 체계적으로 정렬하려면 OP 셀명 추가되었다.
'드프리르 사용하여' 와 '데이타스터블'
library(dplyr)
library(data.table)
이는 ',' 표준 '평가' 를 위한 버전이 배열합니다 arrange_ 됩니다.
df1 <- tbl_df(iris)
#using strings or formula
arrange_(df1, c('Petal.Length', 'Petal.Width'))
arrange_(df1, ~Petal.Length, ~Petal.Width)
Source: local data frame [150 x 5]
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
(dbl) (dbl) (dbl) (dbl) (fctr)
1 4.6 3.6 1.0 0.2 setosa
2 4.3 3.0 1.1 0.1 setosa
3 5.8 4.0 1.2 0.2 setosa
4 5.0 3.2 1.2 0.2 setosa
5 4.7 3.2 1.3 0.2 setosa
6 5.4 3.9 1.3 0.4 setosa
7 5.5 3.5 1.3 0.2 setosa
8 4.4 3.0 1.3 0.2 setosa
9 5.0 3.5 1.3 0.3 setosa
10 4.5 2.3 1.3 0.3 setosa
.. ... ... ... ... ...
#Or using a variable
sortBy <- c('Petal.Length', 'Petal.Width')
arrange_(df1, .dots = sortBy)
Source: local data frame [150 x 5]
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
(dbl) (dbl) (dbl) (dbl) (fctr)
1 4.6 3.6 1.0 0.2 setosa
2 4.3 3.0 1.1 0.1 setosa
3 5.8 4.0 1.2 0.2 setosa
4 5.0 3.2 1.2 0.2 setosa
5 4.7 3.2 1.3 0.2 setosa
6 5.5 3.5 1.3 0.2 setosa
7 4.4 3.0 1.3 0.2 setosa
8 4.4 3.2 1.3 0.2 setosa
9 5.0 3.5 1.3 0.3 setosa
10 4.5 2.3 1.3 0.3 setosa
.. ... ... ... ... ...
#Doing the same operation except sorting Petal.Length in descending order
sortByDesc <- c('desc(Petal.Length)', 'Petal.Width')
arrange_(df1, .dots = sortByDesc)
여기에 자세한 정보: https://cran.r-project.org/web/packages/dplyr/vignettes/nse.html
또한 공식을 그대로 사용하는 것이 좋습니다 평가할 수 있는 환경을 표현식에서는 캡처
dt1 <- data.table(iris) #not really required, as you can work directly on your data.frame
sortBy <- c('Petal.Length', 'Petal.Width')
sortType <- c(-1, 1)
setorderv(dt1, sortBy, sortType)
dt1
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1: 7.7 2.6 6.9 2.3 virginica
2: 7.7 2.8 6.7 2.0 virginica
3: 7.7 3.8 6.7 2.2 virginica
4: 7.6 3.0 6.6 2.1 virginica
5: 7.9 3.8 6.4 2.0 virginica
---
146: 5.4 3.9 1.3 0.4 setosa
147: 5.8 4.0 1.2 0.2 setosa
148: 5.0 3.2 1.2 0.2 setosa
149: 4.3 3.0 1.1 0.1 setosa
150: 4.6 3.6 1.0 0.2 setosa
생각해서라도 완전성: '에서' () '기능을 사용할 수도 있습니다 조르트비콜 브미스' 패키지:
library(BBmisc)
sortByCol(dd, c("z", "b"), asc = c(FALSE, TRUE))
b x y z
4 Low C 9 2
2 Med D 3 1
1 Hi A 8 1
3 Hi A 9 1
성능 비교:
library(microbenchmark)
microbenchmark(sortByCol(dd, c("z", "b"), asc = c(FALSE, TRUE)), times = 100000)
median 202.878
library(plyr)
microbenchmark(arrange(dd,desc(z),b),times=100000)
median 148.758
microbenchmark(dd[with(dd, order(-z, b)), ], times = 100000)
median 115.872
얼마 전 의해 처음으로 최하위 정렬하려면 분류기 마찬가지로 기계 카드 중 가장 큰 키, 다음, etc. 아니 라이브러리란 필요한 키와 키 조합을 원하는 만큼 수행됨 月有陰晴圓缺).
dd <- dd[order(dd$b, decreasing = FALSE),]
dd <- dd[order(dd$z, decreasing = TRUE),]
가장 간단하고 신뢰할 수 있지만, 아닐 수도 있다는 것은
그냥 생각해서라도 완성도, 이후 지금까지 약 정렬 열별 숫자임 크지 않다 "고 말했다. 것이라 할 수 있다는 것은 바람직하지 않다 "고 자주 (열의 순서를 바꿀 수 있는 길이 열렸다 때문에, 오류에 대한) 이지만, 일부 특정 상황에 경우 예를 들어 필요한 업무 처리 등 열을 빠르게 변화하는 명령이라구요 위험이 없다), 특히 다룰 때 가장 먼저 할 일이 될 수도 있지만, 그 많은 수의 열.
이 경우, () '는' 도스콜 구조:
ind <- do.call(what = "order", args = iris[,c(5,1,2,3)])
iris[ind, ]
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 14 4.3 3.0 1.1 0.1 setosa
## 9 4.4 2.9 1.4 0.2 setosa
## 39 4.4 3.0 1.3 0.2 setosa
## 43 4.4 3.2 1.3 0.2 setosa
## 42 4.5 2.3 1.3 0.3 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 48 4.6 3.2 1.4 0.2 setosa
## 7 4.6 3.4 1.4 0.3 setosa
## (...)
내가 어렸을 때 내가 하고 싶은 내 오더할 과정을 겪고, 그 위의 솔루션뀉뀉뀉뀉 자동화합니다 ᄂ씨 열 때마다 열 이름이 다를 수 있다. 내가 찾은 이 작업을 수행할 수 있는 '패키지' 수퍼 도움됐네 함수은 정신과 간단한 방법으로:
dfOrder(myDf, columnIndices)
여기서 '지수' 는 하나 이상의 열을 콜럼닌딕스 순서대로 운영까지도 정렬하려면 저들이요 자세한 내용은 여기.