data.table을 재구성하는 적절하고 빠른 방법
나는이 데이터 테이블 R의를 :
library(data.table)
set.seed(1234)
DT <- data.table(x=rep(c(1,2,3),each=4), y=c("A","B"), v=sample(1:100,12))
DT
x y v
[1,] 1 A 12
[2,] 1 B 62
[3,] 1 A 60
[4,] 1 B 61
[5,] 2 A 83
[6,] 2 B 97
[7,] 2 A 1
[8,] 2 B 22
[9,] 3 A 99
[10,] 3 B 47
[11,] 3 A 63
[12,] 3 B 49
data.table의 그룹별로 변수 v를 쉽게 합할 수 있습니다.
out <- DT[,list(SUM=sum(v)),by=list(x,y)]
out
x y SUM
[1,] 1 A 72
[2,] 1 B 123
[3,] 2 A 84
[4,] 2 B 119
[5,] 3 A 162
[6,] 3 B 96
그러나 그룹 (y)을 행이 아닌 열로 사용하고 싶습니다. 다음을 사용하여이 작업을 수행 할 수 있습니다 reshape
.
out <- reshape(out,direction='wide',idvar='x', timevar='y')
out
x SUM.A SUM.B
[1,] 1 72 123
[2,] 2 84 119
[3,] 3 162 96
데이터를 집계 한 후 모양을 변경하는 더 효율적인 방법이 있습니까? data.table 작업을 사용하여 이러한 작업을 한 단계로 결합하는 방법이 있습니까?
data.table
빠른 패키지 구현 melt/dcast
(C)에서 작동합니다. 또한 여러 기둥 을 용융 및 주조 할 수있는 추가 기능이 있습니다 . Github에서 data.tables 를 사용한 새로운 효율적인 재구성을 참조하십시오 .
data.table에 대한 melt / dcast 기능은 v1.9.0부터 사용할 수 있으며 다음과 같은 기능이 있습니다.
reshape2
캐스팅하기 전에 패키지 를로드 할 필요가 없습니다 . 그러나 다른 작업을 위해로드하려면로드하기 전에 로드하십시오data.table
.dcast
또한 S3 제네릭입니다. 더 이상dcast.data.table()
. 사용하십시오dcast()
.melt
:'목록'유형의 열에서 녹을 수 있습니다.
이익
variable.factor
및value.factor
이는 기본적으로 있습니다TRUE
및FALSE
과의 호환성을 위해 각각reshape2
. 이를 통해variable
및value
열의 출력 유형을 직접 제어 할 수 있습니다 (요인 여부).melt.data.table
의na.rm = TRUE
매개 변수는 녹는 동안 직접 NA를 제거하도록 내부적으로 최적화되므로 훨씬 더 효율적입니다.신규 :
melt
목록을 수락 할 수 있으며 목록의measure.vars
각 요소에 지정된 열이 함께 결합됩니다. 이것은를 사용하여 더욱 촉진됩니다patterns()
. 비 네트 또는을 참조하십시오?melt
.
dcast
:여러
fun.aggregate
및 여러value.var
. 비 네트 또는을 참조하십시오?dcast
.사용
rowid()
때때로 고유 행을 식별하는데 필요한 ID가 열을 생성하는 식으로 직접 기능. ? dcast를 참조하십시오.
이전 벤치 마크 :
melt
: 1,000 만 행 5 열, 61.3 초가 1.2 초로 단축되었습니다.dcast
: 1 백만 행 4 열, 192 초가 3.6 초로 단축되었습니다.
Reminder of Cologne (2013 년 12 월) 프레젠테이션 슬라이드 32 : 왜 dcast
풀 요청을 제출하지 reshape2
않습니까?
이 기능은 이제 Zach의 답변에서 볼 수 있듯이 data.table (버전 1.8.11부터)에 구현되었습니다.
나는 Arun의 코드 덩어리를 여기 에서 보았다 . 그래서 data.table
해결책 이 있다고 생각 합니다. 이 문제에 적용 :
library(data.table)
set.seed(1234)
DT <- data.table(x=rep(c(1,2,3),each=1e6),
y=c("A","B"),
v=sample(1:100,12))
out <- DT[,list(SUM=sum(v)),by=list(x,y)]
# edit (mnel) to avoid setNames which creates a copy
# when calling `names<-` inside the function
out[, as.list(setattr(SUM, 'names', y)), by=list(x)]
})
x A B
1: 1 26499966 28166677
2: 2 26499978 28166673
3: 3 26500056 28166650
이것은 DWin의 접근 방식과 동일한 결과를 제공합니다.
tapply(DT$v,list(DT$x, DT$y), FUN=sum)
A B
1 26499966 28166677
2 26499978 28166673
3 26500056 28166650
또한 빠릅니다.
system.time({
out <- DT[,list(SUM=sum(v)),by=list(x,y)]
out[, as.list(setattr(SUM, 'names', y)), by=list(x)]})
## user system elapsed
## 0.64 0.05 0.70
system.time(tapply(DT$v,list(DT$x, DT$y), FUN=sum))
## user system elapsed
## 7.23 0.16 7.39
최신 정보
이 솔루션이 불균형 데이터 세트 (즉, 일부 조합이 존재하지 않음)에서도 작동하려면 먼저 데이터 테이블에 입력해야합니다.
library(data.table)
set.seed(1234)
DT <- data.table(x=c(rep(c(1,2,3),each=4),3,4), y=c("A","B"), v=sample(1:100,14))
out <- DT[,list(SUM=sum(v)),by=list(x,y)]
setkey(out, x, y)
intDT <- expand.grid(unique(out[,x]), unique(out[,y]))
setnames(intDT, c("x", "y"))
out <- out[intDT]
out[, as.list(setattr(SUM, 'names', y)), by=list(x)]
요약
주석을 위와 결합하여 다음은 단선 솔루션입니다.
DT[, sum(v), keyby = list(x,y)][CJ(unique(x), unique(y)), allow.cartesian = T][,
setNames(as.list(V1), paste(y)), by = x]
합계 이상을 갖도록 수정하는 것도 쉽습니다. 예 :
DT[, list(sum(v), mean(v)), keyby = list(x,y)][CJ(unique(x), unique(y)), allow.cartesian = T][,
setNames(as.list(c(V1, V2)), c(paste0(y,".sum"), paste0(y,".mean"))), by = x]
# x A.sum B.sum A.mean B.mean
#1: 1 72 123 36.00000 61.5
#2: 2 84 119 42.00000 59.5
#3: 3 187 96 62.33333 48.0
#4: 4 NA 81 NA 81.0
Data.table 객체는 'data.frame'에서 상속되므로 tapply를 사용할 수 있습니다.
> tapply(DT$v,list(DT$x, DT$y), FUN=sum)
AA BB
a 72 123
b 84 119
c 162 96
도서관 dcast
에서 사용할 수 있습니다 reshape2
. 다음은 코드입니다.
# DUMMY DATA
library(data.table)
mydf = data.table(
x = rep(1:3, each = 4),
y = rep(c('A', 'B'), times = 2),
v = rpois(12, 30)
)
# USE RESHAPE2
library(reshape2)
dcast(mydf, x ~ y, fun = sum, value_var = "v")
NOTE: The tapply
solution would be much faster.
참고URL : https://stackoverflow.com/questions/6902087/proper-fastest-way-to-reshape-a-data-table
'developer tip' 카테고리의 다른 글
C 표준 라이브러리 함수를 위험하게 만드는 것은 무엇이며 대안은 무엇입니까? (0) | 2020.11.14 |
---|---|
모바일 용 메타 태그 – 사용해야합니까? (0) | 2020.11.14 |
.java에서 JAR을 만드는 방법 (0) | 2020.11.14 |
PostgreSQL로 중복 행 찾기 (0) | 2020.11.14 |
팬더 : 시간 간격 별 롤링 평균 (0) | 2020.11.14 |