'2019/11'에 해당되는 글 10건
여러 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)]
'R' 카테고리의 다른 글
| 이중괄호의 의미 ( Ex>iris[['Sepal.Length']] ) (0) | 2019.11.07 |
|---|---|
| rbind, cbind, merge 차이 (0) | 2019.11.07 |
| 기본.데이터프레임(data frame).샘플 (0) | 2019.11.06 |
| 기본.데이터프레임(data frame) (0) | 2019.11.05 |
| 기초.데이타 타입.벡터 연산 (0) | 2019.11.05 |
이중괄호의 의미 ( Ex>iris[['Sepal.Length']] )
RR 매뉴얼) 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

'R' 카테고리의 다른 글
| 여러 bind 함수간의 속도 비교 (0) | 2019.11.08 |
|---|---|
| 이중괄호의 의미 ( Ex>iris[['Sepal.Length']] ) (0) | 2019.11.07 |
| 기본.데이터프레임(data frame).샘플 (0) | 2019.11.06 |
| 기본.데이터프레임(data frame) (0) | 2019.11.05 |
| 기초.데이타 타입.벡터 연산 (0) | 2019.11.05 |
기본.데이터프레임(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
- 벡터값 출력 #2
- 벡터값 출력 #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 |
테마구성도(2019-A08)
WordPress, 워드프레스

'WordPress, 워드프레스' 카테고리의 다른 글
| 쓸만한 테마 설치하기.astra (0) | 2020.07.28 |
|---|---|
| AWS.WordPress.FirstSetting (0) | 2020.07.27 |
| Theme.Template.hierachy (0) | 2019.10.24 |
| 기타 참고 사항 (0) | 2019.10.22 |
| 워드 프레스 설치시 고려사항, 주의점 (0) | 2019.10.17 |
