2019년 11월 25일 월요일
2019년 11월 13일 수요일
R: dplyr 함수 정복
2019년 11월 12일 화요일
SQL: 열 선택하기(SELECT)
2019년 10월 23일 수요일
SQL: Oracle SQL Developer 쿼리를 활용하여 csv 파일 익스포트하기
평소 SQL 쿼리를 실행한 다음,
질의 결과에서 우클릭 -> 익스포트 -> 익스포트 마법사를 사용하여 csv 파일로 추출하고 있었습니다.
그러다 많은 테이블을 csv 파일로 추출해야 하는 상황이 발생하였고,
일일이 클릭으로 추출하기에는 귀찮았습니다.
다음을 참고하시면 쿼리를 실행하는 과정에서 csv 파일을 추출할 수 있습니다..
쿼리 앞, 뒤로 SPOOL 문을 추가하신 다음,
쿼리의 SELECT 문 다음에 /*csv*/ 주석을 추가하시면 됩니다.
그리고 반드시 띄어쓰기 없이 /*csv*/ 라고 작성하셔야 합니다.
만약 /* csv */ 와 같이 주석 기호 다음으로 띄어쓰기를 하실 경우 csv 형식로 파일이 추출되지 않습니다.
마지막으로 쿼리를 실행하실 때 F9 키가 아닌 F5 키를 사용하셔야 합니다.
질의 결과에서 우클릭 -> 익스포트 -> 익스포트 마법사를 사용하여 csv 파일로 추출하고 있었습니다.
그러다 많은 테이블을 csv 파일로 추출해야 하는 상황이 발생하였고,
일일이 클릭으로 추출하기에는 귀찮았습니다.
다음을 참고하시면 쿼리를 실행하는 과정에서 csv 파일을 추출할 수 있습니다..
1
2
3
4
5
6
|
SPOOL 'csv 파일을 저장할 경로/fileName.csv';
SELECT /*csv*/ *
FROM table;
SPOOL OFF;
| cs |
쿼리 앞, 뒤로 SPOOL 문을 추가하신 다음,
쿼리의 SELECT 문 다음에 /*csv*/ 주석을 추가하시면 됩니다.
그리고 반드시 띄어쓰기 없이 /*csv*/ 라고 작성하셔야 합니다.
만약 /* csv */ 와 같이 주석 기호 다음으로 띄어쓰기를 하실 경우 csv 형식로 파일이 추출되지 않습니다.
마지막으로 쿼리를 실행하실 때 F9 키가 아닌 F5 키를 사용하셔야 합니다.
2019년 9월 5일 목요일
SQL: JOIN
animal_outs 테이블에는 있지만 animal_ins 테이블에는 없는 데이터를 조회하고 싶은 경우 아래 코드를 실행하면 된다.
1
2
3
4
5
|
SELECT outs.animal_id, outs.name
FROM animal_ins ins
RIGHT JOIN animal_outs outs ON ins.animal_id = outs.animal_id
WHERE ins.animal_id is null
-- animal_outs에는 있지만 animal_ins에는 없는 데이터를 추출하는 조건
ORDER BY outs.animal_id;
| cs |
2019년 9월 4일 수요일
SQL: HAVING
아래의 코드는 animal_ins 테이블에서 name 열을 기준으로 name count가 2 이상인 경우에만 그룹핑을 한 다음 name열과 name count를 조회한다.
'name count가 2 이상' 조건을 사용하기 위해 WHERE 절을 사용할 수 있겠다고 생각하여 아래의 코드를 작성하였습니다.
하지만 아래의 에러가 발생하였습니다. WHERE 절에서는 SELECT 절에서 설정한 열의 별명을 사용할 수 없었습니다.
SQL 실행 중 오류가 발생하였습니다.
Unknown column 'count' in 'where clause'
그래서 별명 count를 사용하지 않고 count(name)을 사용하여 아래의 코드를 작성하였습니다.
하지만 아래의 에러가 발생하였습니다. WHERE 절에서는 count와 같은 그룹핑 함수를 사용할 수 없었습니다.
SQL 실행 중 오류가 발생하였습니다.
Invalid use of group function
위와 같은 과정을 통해 HAVING 절과 WHERE 절의 역할을 이해할 수 있었습니다. 그룹핑 함수를 이용하여 조건을 적용하고 싶다면 HAVING을 사용해야 합니다.
1
2
3
4
|
SELECT name, count(name) count
FROM animal_ins
GROUP BY name
HAVING count > 1;
| cs |
'name count가 2 이상' 조건을 사용하기 위해 WHERE 절을 사용할 수 있겠다고 생각하여 아래의 코드를 작성하였습니다.
1
2
3
4
|
SELECT name, count(name) count
FROM animal_ins
WHERE count > 1
GROUP BY name;
| cs |
하지만 아래의 에러가 발생하였습니다. WHERE 절에서는 SELECT 절에서 설정한 열의 별명을 사용할 수 없었습니다.
SQL 실행 중 오류가 발생하였습니다.
Unknown column 'count' in 'where clause'
그래서 별명 count를 사용하지 않고 count(name)을 사용하여 아래의 코드를 작성하였습니다.
1
2
3
4
|
SELECT name, count(name) count
FROM animal_ins
WHERE count(name) > 1
GROUP BY name;
| cs |
하지만 아래의 에러가 발생하였습니다. WHERE 절에서는 count와 같은 그룹핑 함수를 사용할 수 없었습니다.
SQL 실행 중 오류가 발생하였습니다.
Invalid use of group function
위와 같은 과정을 통해 HAVING 절과 WHERE 절의 역할을 이해할 수 있었습니다. 그룹핑 함수를 이용하여 조건을 적용하고 싶다면 HAVING을 사용해야 합니다.
2019년 9월 3일 화요일
SQL: 최솟값 구하기
아래의 코드는 datetime의 최솟값을 조회합니다.
1
2
|
SELECT min(datetime)
FROM animal_ins;
| cs |
SELECT 절에서 min(열의 이름)을 사용하여 특정 열의 최솟값을 조회할 수 있습니다.
SQL: 특정 열의 NULL 조회하기
아래 코드는 animal_ins 테이블에서 name이 NULL인 데이터의 animal_id를 조회할 수 있다.
특정 열의 NULL 값을 조회하려면 WHERE 절에서
'열 이름 is null'
을 작성하면 된다.
만약 NULL 값을 제외한 데이터를 조회하려면
'열 이름 is not null'
을 작성하면 된다.
1
2
3
|
SELECT animal_id
FROM animal_ins
WHERE name is null
| cs |
특정 열의 NULL 값을 조회하려면 WHERE 절에서
'열 이름 is null'
을 작성하면 된다.
1
2
3
|
SELECT *
FROM 테이블의 이름
WHERE 열의 이름 is null
| cs |
만약 NULL 값을 제외한 데이터를 조회하려면
'열 이름 is not null'
을 작성하면 된다.
1
2
3
|
SELECT *
FROM 테이블의 이름
WHERE 열의 이름 is not null
| cs |
2019년 8월 25일 일요일
2019년 7월 3일 수요일
2019년 7월 2일 화요일
R: Rtools을 설치했는데 rstudio에서 rtools를 인식하지 못하는 경우
1
2
|
Sys.setenv(PATH = paste("rtools을 설치한 경로; ... /Rtools/bin/", Sys.getenv("PATH"), sep = ";"))
Sys.setenv(BINPREF = "rtools을 설치한 경로; .../Rtools/mingw_ 시스템 종류, 64비트 운영 체제일 경우; 64/bin/")
| cs |
위 명령어를 실행하면 rtools를 설치한 디렉토리가 환경 변수에 추가되어 rstudio에서 rtools을 인식할 수 있게 된다.
2019년 6월 21일 금요일
R: Lists
1. 리스트의 성질(1)
리스트는 벡터, 매트릭스, 데이터 프레임, 리스트 등 모든 것을 포함할 수 있다.
2. 리스트의 성질(2)
리스트는 모든 요소를 포함할 수 있다. 리스트가 포함하는 요소의 성질을 기억하기 힘들기 때문에 요소에 이름을 부여하여 효율적으로 리스트를 관리할 수 있다.
3. 리스트의 요소 선택하기
두 개의 대괄호 사이에 "열 이름"을 입력하거나([["열 이름"]]),
$ 뒤에 열 이름을 입력한다($열 이름).
대괄호를 사용할 경우 따옴표를 사용해야하고,
$을 사용할 경우 따옴표로 사용하지 않는다.
4. 리스트에 요소 추가하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
> # Vector with numerics from 1 up to 10
> my_vector <- 1:10
>
> # Matrix with numerics from 1 up to 9
> my_matrix <- matrix(1:9, ncol = 3)
>
> # First 10 elements of the built-in data frame mtcars
> my_df <- mtcars[1:10,]
>
> # Construct list with these different elements:
> my_list <- list(my_vector, my_matrix, my_df)
> my_list
[[1]]
[1] 1 2 3 4 5 6 7 8 9 10
[[2]]
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
[[3]]
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
| cs |
리스트는 벡터, 매트릭스, 데이터 프레임, 리스트 등 모든 것을 포함할 수 있다.
2. 리스트의 성질(2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
> # Vector with numerics from 1 up to 10
> my_vector <- 1:10
>
> # Matrix with numerics from 1 up to 9
> my_matrix <- matrix(1:9, ncol = 3)
>
> # First 10 elements of the built-in data frame mtcars
> my_df <- mtcars[1:10,]
>
> # Adapt list() call to give the components names
> my_list <- list(vec = my_vector, mat = my_matrix, df = my_df)
>
> # Print out my_list
> my_list
$vec
[1] 1 2 3 4 5 6 7 8 9 10
$mat
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
$df
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
| cs |
리스트는 모든 요소를 포함할 수 있다. 리스트가 포함하는 요소의 성질을 기억하기 힘들기 때문에 요소에 이름을 부여하여 효율적으로 리스트를 관리할 수 있다.
3. 리스트의 요소 선택하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
> # shining_list is already pre-loaded in the workspace
>
> # Print out the vector representing the actors
> shining_list[["actors"]]
[1] "Jack Nicholson" "Shelley Duvall" "Danny Lloyd" "Scatman Crothers"
[5] "Barry Nelson"
>
> shining_list$actors
[1] "Jack Nicholson" "Shelley Duvall" "Danny Lloyd" "Scatman Crothers"
[5] "Barry Nelson"
>
> # Print the second element of the vector representing the actors
> shining_list[["actors"]][2]
[1] "Shelley Duvall"
| cs |
두 개의 대괄호 사이에 "열 이름"을 입력하거나([["열 이름"]]),
$ 뒤에 열 이름을 입력한다($열 이름).
대괄호를 사용할 경우 따옴표를 사용해야하고,
$을 사용할 경우 따옴표로 사용하지 않는다.
4. 리스트에 요소 추가하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
> # shining_list, the list containing movie name, actors and reviews, is pre-loaded in the workspace
>
> # We forgot something; add the year to shining_list
> shining_list_full <- c(shining_list, year = 1980)
> # ext_list <- c(my_list, 추가하려는 요소의 이름 = 추가하려는 요소)
>
> # Have a look at shining_list_full
> str(shining_list_full)
List of 4
$ moviename: chr "The Shining"
$ actors : chr [1:5] "Jack Nicholson" "Shelley Duvall" "Danny Lloyd" "Scatman Crothers" ...
$ reviews :'data.frame': 3 obs. of 3 variables:
..$ scores : num [1:3] 4.5 4 5
..$ sources : Factor w/ 3 levels "IMDb1","IMDb2",..: 1 2 3
..$ comments: Factor w/ 3 levels "A masterpiece of psychological horror",..: 3 2 1
$ year : num 1980
| cs |
2019년 6월 20일 목요일
R: Data frames
1. 데이터 프레임에서 subset() 함수를 사용하여 조건을 만족하는 행만 추출하기
"subset = " 뒤에 조건을 작성하면 된다.
2. order()함수를 이용하여 특정 열의 순위를 기준으로 데이터 프레임 정렬하기
1
2
3
4
5
6
7
8
|
> # planets_df is pre-loaded in your workspace
>
> # Select planets with diameter < 1
> subset(planets_df, subset = diameter < 1)
name type diameter rotation rings
1 Mercury Terrestrial planet 0.382 58.64 FALSE
2 Venus Terrestrial planet 0.949 -243.02 FALSE
4 Mars Terrestrial planet 0.532 1.03 FALSE
| cs |
"subset = " 뒤에 조건을 작성하면 된다.
2. order()함수를 이용하여 특정 열의 순위를 기준으로 데이터 프레임 정렬하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
> # planets_df is pre-loaded in your workspace
>
> # Use order() to create positions
> positions <- order(planets_df$diameter)
>
> positions
[1] 1 4 2 3 8 7 6 5
>
> # Use positions to sort planets_df
> planets_df[positions, ]
name type diameter rotation rings
1 Mercury Terrestrial planet 0.382 58.64 FALSE
4 Mars Terrestrial planet 0.532 1.03 FALSE
2 Venus Terrestrial planet 0.949 -243.02 FALSE
3 Earth Terrestrial planet 1.000 1.00 FALSE
8 Neptune Gas giant 3.883 0.67 TRUE
7 Uranus Gas giant 4.007 -0.72 TRUE
6 Saturn Gas giant 9.449 0.43 TRUE
5 Jupiter Gas giant 11.209 0.41 TRUE
| cs |
R: Factors
1. 순서형 변수
2. 팩터 레벨 이름 변경하기
3. 팩터를 포함하는 벡터 요약하기
1
2
3
4
5
6
7
|
> # Temperature
> temperature_vector <- c("High", "Low", "High","Low", "Medium")
> factor_temperature_vector <- factor(temperature_vector, order = TRUE, levels = c("Low", "Medium", "High"))
> # levels: 오름차순으로 레벨을 부여한다.
> factor_temperature_vector
[1] High Low High Low Medium
Levels: Low < Medium < High
| cs |
2. 팩터 레벨 이름 변경하기
1
2
3
4
5
6
7
8
9
10
|
> # Code to build factor_survey_vector
> survey_vector <- c("M", "F", "F", "M", "M")
> factor_survey_vector <- factor(survey_vector)
>
> # Specify the levels of factor_survey_vector
> levels(factor_survey_vector) <- c("Female", "Male")
>
> factor_survey_vector
[1] Male Female Female Male Male
Levels: Female Male
| cs |
3. 팩터를 포함하는 벡터 요약하기
1
2
3
4
5
6
7
8
9
|
> # Generate summary for survey_vector
> summary(survey_vector)
Length Class Mode
5 character character
> # 문자열 벡터를 요약하면 원소가 몇 개인지 알 수 없고 벡터의 길이와 클래스를 출력한다.
>
> # Generate summary for factor_survey_vector
> summary(factor_survey_vector)
Female Male
2 3
> # 팩터 벡터를 요약하면 원소가 몇 개인지 출력한다.
| cs |
2019년 6월 19일 수요일
R: Matrices
1. 행의 합 구하기
※ 워크스페이스에 저장된 내용 조회하기
※ 열의 합은 colSums() 함수를 사용한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
> # Construct star_wars_matrix
> box_office <- c(460.998, 314.4, 290.475, 247.900, 309.306, 165.8)
> star_wars_matrix <- matrix(box_office, nrow = 3, byrow = TRUE,
dimnames = list(c("A New Hope", "The Empire Strikes Back", "Return of the Jedi"),
c("US", "non-US")))
> # dimnames: 리스트의 첫 번째가 rownames, 두 번째가 colnames
>
> # Calculate worldwide box office figures
> worldwide_vector <- rowSums(star_wars_matrix)
>
> worldwide_vector
A New Hope The Empire Strikes Back Return of the Jedi
775.398 538.375 475.106
| cs |
※ 워크스페이스에 저장된 내용 조회하기
1
2
|
> ls()
[1] "star_wars_matrix" "star_wars_matrix2"
| cs |
※ 열의 합은 colSums() 함수를 사용한다.
2019년 5월 23일 목요일
R: 오프라인 환경에서 설치한 패키지를 로드할 때 lazy-load database 에러가 발생하는 경우
오프라인 환경에서 설치한 패키지를 다음과 같이 로드하였을 때,
다음과 같은 에러가 발생하였습니다.
lazy-load database '패키지 설치 경로/R/패키지 이름.rdb' is corrupt
해결책은 간단합니다. R 세션을 재실행해주면 됩니다. 코드는 다음과 같습니다.
또는 rstudio를 사용하고 계실 경우 Ctrl + Shift + F10을 누르시면 R 세션을 재실행합니다.
R 세션을 재실행한 뒤 다시 패키지를 로드할 경우 에러가 발생하지 않는 것을 확인할 수 있습니다.
1
|
library(패키지 이름, lib.loc = "패키지 설치 경로")
| cs |
다음과 같은 에러가 발생하였습니다.
lazy-load database '패키지 설치 경로/R/패키지 이름.rdb' is corrupt
해결책은 간단합니다. R 세션을 재실행해주면 됩니다. 코드는 다음과 같습니다.
1
|
.rs.restartR()
| cs |
또는 rstudio를 사용하고 계실 경우 Ctrl + Shift + F10을 누르시면 R 세션을 재실행합니다.
R 세션을 재실행한 뒤 다시 패키지를 로드할 경우 에러가 발생하지 않는 것을 확인할 수 있습니다.
2019년 5월 22일 수요일
R: 오프라인 환경에서 github 패키지 설치하기
1. 패키지의 github에서 ZIP 파일을 다운로드합니다.
2. ZIP 파일 압축을 풀어줍니다.
3. 다음 코드를 실행합니다.
ZIP file path: 압축을 푼 ZIP 파일 폴더의 경로를 입력합니다.
type: 압축을 풀었기 때문에 "source"를 입력합니다.
repos: 로컬 파일로 패키지를 설치하기 때문에 NULL 옵션을 사용합니다.
lib: 패캐지를 설치할 라이브러리의 경로를 입력합니다.
3. 패키지 설치에 성공할 경우 설정하신 library path에 "package name-master" 폴더가 생성됩니다.
2. ZIP 파일 압축을 풀어줍니다.
3. 다음 코드를 실행합니다.
1
|
install.packages("ZIP file path", type = "source", repos = NULL, lib = "library path")
| cs |
ZIP file path: 압축을 푼 ZIP 파일 폴더의 경로를 입력합니다.
type: 압축을 풀었기 때문에 "source"를 입력합니다.
repos: 로컬 파일로 패키지를 설치하기 때문에 NULL 옵션을 사용합니다.
lib: 패캐지를 설치할 라이브러리의 경로를 입력합니다.
3. 패키지 설치에 성공할 경우 설정하신 library path에 "package name-master" 폴더가 생성됩니다.
2019년 4월 24일 수요일
R: dplyr 패키지를 사용하여 사분위수 구하기
1
2
|
data %>%
summarise(quantile = quantile(BMI_Z_SCORE))
| cs |
data라는 data.table에서 사분위수를 구하기 위해 위와 같은 코드를 실행하였다.
그 결과,
Error: Column `quantile` must be length 1(a summary value)
위와 같은 에러가 발생하였다.
이 경우 quantile() 함수로 사분위수를 한 번에 얻는 것이 아니라 quantile() 함수 한 번에 하나의 사분위수를 얻어야 한다.
1
2
3
4
5
6
|
data %>%
summarise(Q0 = quantile(BMI_Z_SCORE, probs = 0.00),
Q1 = quantile(BMI_Z_SCORE, probs = 0.25),
Q2 = quantile(BMI_Z_SCORE, probs = 0.50),
Q3 = quantile(BMI_Z_SCORE, probs = 0.75),
Q4 = quantile(BMI_Z_SCORE, probs = 1.00))
| cs |
0사분위수는 최솟값,
2사분위수는 중위수,
4사분위수는 최댓값과 같으므로 아래와 같이 작성할 수 있다.
1
2
3
4
5
6
|
data %>%
summarise(MIN = min(BMI_Z_SCORE),
Q1 = quantile(BMI_Z_SCORE, probs = 0.25),
MEDIAN = median(BMI_Z_SCORE),
Q3 = quantile(BMI_Z_SCORE, probs = 0.75),
MAX = max(BMI_Z_SCORE)
| cs |
피드 구독하기:
글 (Atom)