2019년 11월 13일 수요일

R: dplyr 함수 정복

1. rename: 열 이름 바꾸기

1
rename(data.frame 이름, new name = old name)
cs

data.frame에서 old name 열의 이름을 new name으로 변경합니다.

만약 dplyr 파이프 연산자를 사용할 경우

1
2
data.frame %>%
    rename(new name = old name)
cs

과 같이 rename에서 data.frame 이름을 생략할 수 있다.

2019년 11월 12일 화요일

SQL: 열 선택하기(SELECT)

1. LIMIT 키워드를 사용하여 출력되는 열의 수를 제한할 수 있다.

1
2
3
SELECT *
FROM people
LIMIT 10;
cs

2. 열에서 유일한 값을 선택하고 싶으면 DISTINCT 키워드를 사용한다.

1
2
SELECT DISTINCT language
FROM films;
cs

2019년 10월 23일 수요일

SQL: Oracle SQL Developer 쿼리를 활용하여 csv 파일 익스포트하기

평소 SQL 쿼리를 실행한 다음,
질의 결과에서 우클릭 -> 익스포트 -> 익스포트 마법사를 사용하여 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를 조회한다.

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를 조회할 수 있다.
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일 일요일

R: 함수의 소스 코드를 보고 싶을 때

문자 커서를 함수에 위치시킨 다음

키보드의 F2 키를 누르면 함수의 소스 코드가 함수 이름의 새 탭으로 열립니다.

혹은 콘솔 창에 함수 이름을 괄호 없이 입력하면 소스 코드를 확인할 수 있습니다.

2019년 7월 3일 수요일

R: if문

1.
1
2
3
4
5
6
7
8
9
> x <- 6
> if (x %% 2 == 0) {
+     print("divisible by 2")
+ } else if (x %% 3 == 0) {
+     print("divisible by 3")
+ } else {
+     print("not divisible by 2 nor by 3...")
+ }
[1] "divisible by 2"
cs
두번째(else if문) 조건이 참이더라도 첫번째(if문) 조건이 참일 경우 첫번째 then절을 실행하고 if문을 종료한다.

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)

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() 함수를 사용하여 조건을 만족하는 행만 추출하기

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
[11 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. 순서형 변수

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. 행의 합 구하기

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 에러가 발생하는 경우

오프라인 환경에서 설치한 패키지를 다음과 같이 로드하였을 때,
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. 다음 코드를 실행합니다.

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