StoryCode

여러 bind 함수간의 속도 비교

R
반응형

#참조 : https://rfriend.tistory.com/225

 

이번 포스팅에서는 여러개의 데이터 프레임을 한꺼번에 하나의 데이터프레임으로 묶는 몇가지 방법을 알아보고, 성능 측면을 비교해보겠습니다.

 

이번 포스팅은 andrew 님이 r-bloggers.com 에 썼던 을 그대로 가져다가 번역을 한 내용입니다. 

 

[ Source ] Concatenating a list of data frames , June 6, 2014, By andrew

* source : http://www.r-bloggers.com/concatenating-a-list-of-data-frames/

 

결론 먼저 말씀드리면, data.table package의 rbindlist(data) 함수가 속도 면에서 월등히 빠르네요.

 

 

 

[ R로 여러개의 데이터프레임을 한꺼번에 하나의 데이터프레임으로 묶기 ]

 

 

 

 

0) 문제 (The problem)

 

아래처럼 3개의 칼럼으로 구성된 100,000 개의 자잘한 데이터 프레임을 한개의 커다란 데이터 프레임으로 합치는 것이 풀어야 할 문제, 미션입니다.

 

data = list() 로 해서 전체 데이터 프레임들을 data라는 리스트로 만들어서 아래 각 방법별 예제에 사용하였습니다.

 

 

 

1) The navie solution : do.call(rbind, data)

 

가장 쉽게 생각할 수 있는 방법으로 base package에 포함되어 있는 rbind() 함수를 do.call 함수로 계속 호출해서 여러개의 데이터 프레임을 위/아래로 합치는 방법입니다. 

 

이거 한번 돌리니 정말 시간 오래 걸리네요.  @@~  낮잠 잠깐 자고 와도 될 정도로요.

 

 

 

 

2-1) plyr package : ldply(data, rbind)

 

두번째 방법은 plyr package의 ldply(data, rbind) 함수를 사용하는 방법입니다.

 

 

 

 

2-2) plyr package : rbind.fill(data)

 

세번째 방법은 plyr package의 rbind.fill(data) 함수를 사용하는 방법입니다.  결과는 앞의 두 방법과 동일함을 알 수 있습니다.

 

 

 

 

 

3) data.table package : rbindlist(data)

 

마지막 방법은 data.table package의 rbindlist(data) 함수를 사용하는 방법입니다.

 

 

 

 

4) 벤치마킹 테스트 (bechmarking test)

 

 

패키지/함수별 성능 비교를 해본 결과 data.table 패키지의 rbindlist(data) 함수가 월등히 빠르다는 것을 알 수 있습니다.  위의 벤치마킹 결과를 보면, 속도가 가장 빨랐던 rbindlist(data)를 1로 놨을 때, 상대적인 속도(relative 칼럼)를 보면 rbind.fill(data)가 86.932로서 rbindlist(data)보다 86배 더 오래걸리고, ldply(data, rbind)가 292.644로서 rbindlist(data)보다 292배 더 오래걸린다는 뜻입니다.  do.call(rbind, data)는 rbindlist(data) 보다 상대적으로 668.692배 더 시간이 걸리는 것으로 나오네요.

 

rbindlist(data)가 훨등히 속도가 빠른 이유는 두가지인데요,

 

(1) rbind() 함수가 각 데이터 프레임의 칼럼 이름을 확인하고, 칼럼 이름이 다를 경우 재정렬해서 합치는데 반해, data.table 패키지의 rbindlist() 함수는 각 데이터 프레임의 칼럼 이름을 확인하지 않고 단지 위치(position)를 기준으로 그냥 합쳐버리기 때문이며,

(따라서, rbindlist() 함수를 사용하려면 각 데이터 프레임의 칼럼 위치가 서로 동일해야 함)

 

(2) rbind() 함수는 R code로 작성된 반면에, data.table 패키지의 rbindlist() 는 C 언어로 코딩이 되어있기 때문입니다.



출처: https://rfriend.tistory.com/225 [R, Python 분석과 프로그래밍의 친구 (by R Friend)]

출처: https://rfriend.tistory.com/225 [R, Python 분석과 프로그래밍의 친구 (by R Friend)]

출처: https://rfriend.tistory.com/225 [R, Python 분석과 프로그래밍의 친구 (by R Friend)]

반응형

이중괄호의 의미 ( Ex>iris[['Sepal.Length']] )

R
반응형

R 매뉴얼) Indexing of arrays and vectors is performed using the single and double brackets, ‘[]’ and ‘[[]]’. Also, indexing tagged lists may be done using the ‘$’ operator.

 

열에 직접 Access 하는데 사용한다.

 

iris dataset 에서,

iris[, "Species"] # 결과가 Vector. iris[,5] 와 동일.

iris["Species"] # 결과가 150x1 data frame 이다.

 

# 참조 : https://davetang.org/muse/2013/08/16/double-square-brackets-in-r/

 

head(iris)

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species

1          5.1         3.5          1.4         0.2  setosa

2          4.9         3.0          1.4         0.2  setosa

3          4.7         3.2          1.3         0.2  setosa

4          4.6         3.1          1.5         0.2  setosa

5          5.0         3.6          1.4         0.2  setosa

6          5.4         3.9          1.7         0.4  setosa

 

#vector of sepal lengths using the column name

iris[['Sepal.Length']]

  [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1 5.7 5.1 5.4 5.1

 [23] 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.0 5.5 4.9 4.4 5.1 5.0 4.5 4.4 5.0

 [45] 5.1 4.8 5.1 4.6 5.3 5.0 7.0 6.4 6.9 5.5 6.5 5.7 6.3 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7

 [67] 5.6 5.8 6.2 5.6 5.9 6.1 6.3 6.1 6.4 6.6 6.8 6.7 6.0 5.7 5.5 5.5 5.8 6.0 5.4 6.0 6.7 6.3

 [89] 5.6 5.5 5.5 6.1 5.8 5.0 5.6 5.7 5.7 6.2 5.1 5.7 6.3 5.8 7.1 6.3 6.5 7.6 4.9 7.3 6.7 7.2

[111] 6.5 6.4 6.8 5.7 5.8 6.4 6.5 7.7 7.7 6.0 6.9 5.6 7.7 6.3 6.7 7.2 6.2 6.1 6.4 7.2 7.4 7.9

[133] 6.4 6.3 6.1 7.7 6.3 6.4 6.0 6.9 6.7 6.9 5.8 6.8 6.7 6.7 6.3 6.5 6.2 5.9

 

#vector of sepal lengths using the column index

iris[[1]]

  [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1 5.7 5.1 5.4 5.1

 [23] 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.0 5.5 4.9 4.4 5.1 5.0 4.5 4.4 5.0

 [45] 5.1 4.8 5.1 4.6 5.3 5.0 7.0 6.4 6.9 5.5 6.5 5.7 6.3 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7

 [67] 5.6 5.8 6.2 5.6 5.9 6.1 6.3 6.1 6.4 6.6 6.8 6.7 6.0 5.7 5.5 5.5 5.8 6.0 5.4 6.0 6.7 6.3

 [89] 5.6 5.5 5.5 6.1 5.8 5.0 5.6 5.7 5.7 6.2 5.1 5.7 6.3 5.8 7.1 6.3 6.5 7.6 4.9 7.3 6.7 7.2

[111] 6.5 6.4 6.8 5.7 5.8 6.4 6.5 7.7 7.7 6.0 6.9 5.6 7.7 6.3 6.7 7.2 6.2 6.1 6.4 7.2 7.4 7.9

[133] 6.4 6.3 6.1 7.7 6.3 6.4 6.0 6.9 6.7 6.9 5.8 6.8 6.7 6.7 6.3 6.5 6.2 5.9

 

#the double square brackets in R can also be used

#with the single square brackets

iris[[1]][2]

[1] 4.9

반응형

'R' 카테고리의 다른 글

여러 bind 함수간의 속도 비교  (0) 2019.11.08
rbind, cbind, merge 차이  (0) 2019.11.07
기본.데이터프레임(data frame).샘플  (0) 2019.11.06
기본.데이터프레임(data frame)  (0) 2019.11.05
기초.데이타 타입.벡터 연산  (0) 2019.11.05

rbind, cbind, merge 차이

R
반응형

# 참조 : https://rfriend.tistory.com/51

 

- rbind 와 cbind 는 별거 없음.

 

- merge 는 key 로 다양하게 병합 가능함(= SQL 의 JOIN ).

 

(3-1) merge() : Inner Join 

 

 

(3-2) merge() - Outer Join

 

 

(3-3) merge() : Left Outer Join

 

 

(3-4) merge() : Right Outer Join

 

 

반응형

기본.데이터프레임(data frame).샘플

R
반응형

참조 : https://jjeongil.tistory.com/322

- R 설치하면 iris 라는 샘플 dataset 제공

  iris 데이타셋 설명 : iris 3개품종 각 50 그루씩 150 그루 심은 뒤, 꽃받침의 길이와 폭, 꽃잎의 길이와 폭 측정. Species(setosa, virginica, versicolor) 는 품종.

 

데이타 뽑는 방법)

is.data.frame(iris) # iris 가 data.frame 인지 확인

iris[, "Species"] # 결과가 Vector. iris[,5] 와 동일. iris$Species

iris["Species"] # 결과가 150x1 data frame

 

iris[, c(1:2)]

iris[, c(1,3,5)]

iris[,c("Sepal.Length", "Species")]

iris[1:50]

iris[1:50, c(1,3)]

 

 

 

 

 

반응형

'R' 카테고리의 다른 글

이중괄호의 의미 ( Ex>iris[['Sepal.Length']] )  (0) 2019.11.07
rbind, cbind, merge 차이  (0) 2019.11.07
기본.데이터프레임(data frame)  (0) 2019.11.05
기초.데이타 타입.벡터 연산  (0) 2019.11.05
기초.데이타 타입.변수  (0) 2019.11.05

기본.데이터프레임(data frame)

R
반응형

참조 : https://jjeongil.tistory.com/322

 

샘플)

city <- c("Seoul", "Washington", "BangKok")

rank <- c(1,3,2)

 

city.info <- data.frame(city, rank)

# city               rank

1 Seoul                 1

2 Washington         3

3 BangKok             2

 

설명)

data.frame은 data를 조합해준다.

실제로는 데이타가 csv 같은 형태로 이미 있어서, 쓸 일은 잘 없다.

data.frame = CSV 파일 이라고 생각하는 게 편할 것 같다.

 

반응형

'R' 카테고리의 다른 글

rbind, cbind, merge 차이  (0) 2019.11.07
기본.데이터프레임(data frame).샘플  (0) 2019.11.06
기초.데이타 타입.벡터 연산  (0) 2019.11.05
기초.데이타 타입.변수  (0) 2019.11.05
기초.데이타 타입.벡터  (0) 2019.11.05

기초.데이타 타입.벡터 연산

R
반응형

샘플 #1) d <- c(1,9,3,7,5)

 

d-5 = -4 4 -2 2 0

 

2*d = 2 18 6 14 10

 

 

샘플 #2) x <- (1,2,3), y <-(4,5)

c(x,y) = 1 2 3 4 5 # 단순연결

 

 

샘플 #3) x <- (1,2,3), y <-(4,5,6)

x+y = 5 7 9 # 원소끼리 덧셈

 

 

함수명 

 설명

결과

샘플데이타 d <- c(1,2,3,4,5,6,7,8,9,10)

sum(d) 

 자료의 합

55

mean(d[1:5]) 

 자료의 평균

3 = 1+2+3+4+5 = 15 / 5

median(d)

 자료의 중앙값

 

max(d), min(d) 

 자료의 최대, 최소값 

10 1

var()

 자료의 분산 값

 

sd() 

 자료의 표준편차

 

sort(d) 

sort(x = d, decreasing = TRUE)

 자료를 정렬하여 출력 

x 라는 매개변수에 직접넣기 가능

1 2 3 4 5 6 7 8 9 10

10 9 8 7 6 5 4 3 2 1

range() 

 자료의 범위 (최대값 ~ 최소값)

 

 length(d) 

 자료의 개수

10

 

반응형

'R' 카테고리의 다른 글

rbind, cbind, merge 차이  (0) 2019.11.07
기본.데이터프레임(data frame).샘플  (0) 2019.11.06
기본.데이터프레임(data frame)  (0) 2019.11.05
기초.데이타 타입.변수  (0) 2019.11.05
기초.데이타 타입.벡터  (0) 2019.11.05

기초.데이타 타입.변수

R
반응형

참조 : https://jjeongil.tistory.com/319?category=691385

 

- 기본

a <- 10

 

- 대소문자 구분

- 입력시 숫자/ 문자 상관없음

- 마침표 ( . ) 사용가능 ( ex> val.a <- 15 )

- 숫자. 문자. 불린(TRUE/ FALSE), NULL, NA(Missing Value), NaN(정의불가능한 값), Inf(무한대), -Inf(음의 무한대)

반응형

'R' 카테고리의 다른 글

rbind, cbind, merge 차이  (0) 2019.11.07
기본.데이터프레임(data frame).샘플  (0) 2019.11.06
기본.데이터프레임(data frame)  (0) 2019.11.05
기초.데이타 타입.벡터 연산  (0) 2019.11.05
기초.데이타 타입.벡터  (0) 2019.11.05

기초.데이타 타입.벡터

R
반응형

 

참조 : https://jjeongil.tistory.com/327

벡터.Set

- c() 함수를 사용한 벡터 구문 Sample

   i <- 50:90

   x <- c(1,2,3,4,5) # 숫자 벡터

   y <- c("A", "B", "C", "D", "E") # 문자 벡터

   z <- c(TRUE, FALSE, TRUE, FALSE) # 불린 벡터

 

- 1차원 배열이다.

- 한가지 데이타 타입만 가능하다.

 

- 벡터 구문 확장 #1, 상수나열

  x2 <- c(1,2,3,10:30) # 1 2 3 10~30

 

- 벡터 구문 확장 #2 seq 를 이용한 for loop 발생

  y2 <- seq(0,50, 3) # 3 단위로 간격으로 0부터 50까지 발생. 1 4 7 ... 48

 

- 벡터 구문 확장 #3 rep 를 이용한 repeat 발생

  z2 <- rep(1, times = 10) # 1 을 10 번 반복

  z2 <- rep(1:5, times = 3) # 1~5 까지 3 번 반복

  z2 <- rep(c("A", "B", "C"), times = 5) # "A" "B" "C" 를 5번 발생 "A" "B" "C" "A" "B" "C" "A" "B" "C" "A" "B" "C" "A" "B" "C" 

  z2 <- rep(c("A", "B", "C"), each = 5) # "A" 5번 발생 "B" 5번 발생 "C" 5번 발생

 

 

- 벡터 요소값에 이름 부여하는 2단계. score 라는 벡터에 names() 를 이용하여 이름 부여.

  부여후에 score

  score <- c(10, 30, 50)

  names(score) <- c("NO", "TIMES", "SCORE") # score["NO"] 로 접근 가능

 

 

 

벡터.Get

샘플데이타) d <- c(1, 9, 3, 7, 5)

- 벡터값 출력 #1
d[1:3] # 첫번째, 두번째, 세번째 요소 출력. 1, 9, 3

 

- 벡터값 출력 #2
d[c(1,3,5)] # 첫번째, 세번째, 다섯번째 요소 출력. 1, 3, 5

 

- 벡터값 출력 #3

d[seq(1,5,2)] # 홀수번째 요소 출력. 1, 3, 5

 

- 벡터값 출력 #4

d[-2] # 두번째 요소 제외하고 출력. 1, 3, 7, 5

d[-c(3:5)] # 세번째부터 다섯번째까지 요소는 제외하고 출력. 1, 9

 

 

샘플데이타) score <- c(50,60,70) names(score) <- c("kuk", "eng", "math")

- 벡터값 출력 #1

score[1]

- 벡터값 출력 #2

score["eng"]

- 벡터값 출력 #3

score[c("kuk", "eng")]

 

 

 

 

반응형

'R' 카테고리의 다른 글

rbind, cbind, merge 차이  (0) 2019.11.07
기본.데이터프레임(data frame).샘플  (0) 2019.11.06
기본.데이터프레임(data frame)  (0) 2019.11.05
기초.데이타 타입.벡터 연산  (0) 2019.11.05
기초.데이타 타입.변수  (0) 2019.11.05