본문 바로가기
데이터 [Data]/R

R 데이터 가공: 행과 열의 선택, 변수 추가 및 삭제 (데이터 프레임)

by 냉철하마 2021. 4. 27.

참고도서: R 통계 프로그래밍의 이해 - 차영준, 박진표 (자유아카데미) 3장

www.yes24.com/Product/Goods/68712840

 

R 통계 프로그래밍의 이해

'최근에 빅데이터와 관련된 용어들이 많이 사용되고 있다. 인공지능, 머신러닝, 데이터 과학, 데이터 과학자, 4차 산업혁명 등과 같은 단어들을 많이 접하게 된다. 이처럼 많은 사람들이 빅데이

www.yes24.com

 

> #### 3.1 데이터 프레임에서 행과 열의 선택 ####

>

> # 3.1.1 첨자 []를 이용한 행과 열의 선택 #

>

> #첨자 []를 이용한 데이터 프레임의 행 선택

> name <- c("Cha","Park","Jung","Kim","Lee")

> toeic <- c(900, 850, 990, 690, 730)

> gpa <- c(4.5, 3.8, 4.5, 3.2, 3.1)

> student <- data.frame(name, toeic, gpa, stringsAsFactors = FALSE)

> student

  name toeic gpa

1 Cha 900 4.5

2 Park 850 3.8

3 Jung 990 4.5

4 Kim 690 3.2

5 Lee 730 3.1

> student[3,] ## 3번째 행 전체 선택

  name toeic gpa

3 Jung 990 4.5

> student[c(1,3,5),] ## 1, 3, 5번째 행 전체 선택

  name toeic gpa

1 Cha 900 4.5

3 Jung 990 4.5

5 Lee 730 3.1

>

> #[] 연산자를 이용한 데이터 프레임의 열 선택

> student[, 2] ## 2번째 열 전체 선택

[1] 900 850 990 690 730

> is.vector(student[,2]) ## 열 선택 시 데이터 프레임이 벡터로 변환

[1] TRUE

> student[, 2, drop = FALSE] ## 데이터 구조 변경 FALSE

  toeic

1 900

2 850

3 990

4 690

5 730

> is.data.frame(student[, 2, drop = FALSE])

[1] TRUE

>

> student[, c(2,3)]

  toeic gpa

1 900 4.5

2 850 3.8

3 990 4.5

4 690 3.2

5 730 3.1

> student[, c("toeic","gpa")] ## 2, 3번째 열을 변수인 toeic, gpa로 바꿔 입력하여 출력

  toeic gpa

1 900 4.5

2 850 3.8

3 990 4.5

4 690 3.2

5 730 3.1

>

> #UsingR 패키지를 설치한 후 로드: reaction.time 데이터가 UsingR 패키지에 포함

> install.packages("UsingR") ## reaction.time 데이터: UsingR 패키지를 설치해야 함

> library(UsingR) ## library: 저장 기능

>

> #UsingR::reaction.time의 처음 6행의 데이터 출력

> head(reaction.time)

   age gender control time

1 16-24 F T 1.360075

2 16-24 M T 1.467939

3 16-24 M T 1.512036

4 16-24 F T 1.390647

5 16-24 M T 1.384208

6 16-24 M C 1.393875

>

> #UsingR::reaction.time의 데이터 구조

> str(reaction.time)

'data.frame': 60 obs. of 4 variables:

$ age : Factor w/ 2 levels "16-24","25+": 1 1 1 1 1 1 1 1 1 1 ...

$ gender : Factor w/ 2 levels "F","M": 1 2 2 1 2 2 2 1 1 2 ...

$ control: Factor w/ 2 levels "C","T": 2 2 2 2 2 1 2 2 2 1 ...

$ time : num 1.36 1.47 1.51 1.39 1.38 ...

>

> #UsingR::reaction.time에서 변수 선택

> head(reaction.time[, 2:4]) ## reaction.time의 첫 6(head) 2~4번째 열 출력

  gender control time

1 F T 1.360075

2 M T 1.467939

3 M T 1.512036

4 F T 1.390647

5 M T 1.384208

6 M C 1.393875

> head(reaction.time[, c("gender", "control", "time")])

  gender control time

1 F T 1.360075

2 M T 1.467939

3 M T 1.512036

4 F T 1.390647

5 M T 1.384208

6 M C 1.393875

> head(reaction.time[2:4]) ## reaction.time이 데이터 프레임이므로 ',()' 생략해도 행이 아닌 열 출력

  gender control time

1 F T 1.360075

2 M T 1.467939

3 M T 1.512036

4 F T 1.390647

5 M T 1.384208

6 M C 1.393875

> head(reaction.time[c("gender","control","time")])

  gender control time

1 F T 1.360075

2 M T 1.467939

3 M T 1.512036

4 F T 1.390647

5 M T 1.384208

6 M C 1.393875

>

> #대괄호 []와 이중 대괄호 [[]] 기호의 차이점

> student[2] ## 대괄호 []: 출력 결과가 데이터 프레임

  toeic

1 900

2 850

3 990

4 690

5 730

> student[[2]] ## 이중 대괄호 [[]]: 출력 결과가 벡터

[1] 900 850 990 690 730

> is.data.frame(student[2])

[1] TRUE

> is.vector(student[[2]])

[1] TRUE

>

> # 3.1.2 $ 기호를 이용한 변수의 선택 #

> student$toeic ## 데이터 프레임에서 한 개의 변수를 선택할 때 이용되는 방법

[1] 900 850 990 690 730

> is.vector(student$toeic) ## 위치의 단위가 벡터로 출력됨

[1] TRUE

>

> # 3.1.3 subset()select()를 이용한 행과 변수의 선택 #

>

> #UsingR::reaction.time에서 select() 함수에 의한 변수 선택

> head(reaction.time) ## reaction.time 실행 전, UsingR 패키지가 반드시 설치되어 있어야 함

   age gender control time

1 16-24 F T 1.360075

2 16-24 M T 1.467939

3 16-24 M T 1.512036

4 16-24 F T 1.390647

5 16-24 M T 1.384208

6 16-24 M C 1.393875

> reaction.time.2 <- subset(reaction.time,

+ select=c("gender", "control", "time"))

> head(reaction.time.2) ## reaction.time.2의 첫 6행 출력

  gender control time

1 F T 1.360075

2 M T 1.467939

3 M T 1.512036

4 F T 1.390647

5 M T 1.384208

6 M C 1.393875

>

> reaction.time.2 <- subset(reaction.time, select=gender:time)

## 4개 중 3개의 변수로 구성된 새로운 데이터 프레임 생성

> head(reaction.time.2)

  gender control time

1 F T 1.360075

2 M T 1.467939

3 M T 1.512036

4 F T 1.390647

5 M T 1.384208

6 M C 1.393875

>

> #UsingR::reaction.time에서 subset() 함수에 의하여 행 선택

> reaction.time.3 <- subset(reaction.time, (gender=="F" & control=="T"))

## genderF이고 controlT인 두 변수로 구성된 새 데이터 프레임 생성

> reaction.time.3

  age gender control time

1 16-24 F T 1.360075

4 16-24 F T 1.390647

8 16-24 F T 1.461187

9 16-24 F T 1.382461

12 16-24 F T 1.331092

15 16-24 F T 1.344506

17 16-24 F T 1.520244

19 16-24 F T 1.348420

20 16-24 F T 1.373000

(이하생략)

 

>

> #select()subset() 함수에 의한 변수와 행 선택

> reaction.time.4 <- subset(reaction.time, (gender=="F" & control=="T"),

+ select=c("gender","control","time"))

## reaction.time.3과 같은 조건에 3개의 변수로만 구성된 새 데이터 프레임

> reaction.time.4

gender control time

1 F T 1.360075

4 F T 1.390647

8 F T 1.461187

9 F T 1.382461

12 F T 1.331092

15 F T 1.344506

17 F T 1.520244

19 F T 1.348420

20 F T 1.373000

(이하생략)

 

>

> # 3.1.4 sample() 함수 #

>

> #sample() 함수

> sample(1:10, 7) ## 1부터 10까지 10개의 숫자 중 7개를 비복원추출(without replacement)

[1] 4 6 5 2 9 1 3

> sample(1:10, 7, replace=TRUE) ## 1부터 10까지 10개의 숫자 중 7개를 복원추출

[1] 4 10 1 5 7 3 5

> sample(1:10) ## 전체를 비복원추출

[1] 8 5 1 9 3 6 10 2 4 7

> sample(c("S","F"), 10, replace = TRUE)

## 10번의 베르누이 시행 실시 ('성공or실패' 등의 양자택일을 독립시행으로 실시)

[1] "S" "S" "S" "S" "S" "S" "S" "S" "S" "F"

>

> #UsingR::reaction.time에서 랜덤추출

> install.packages("UsingR")

> library(UsingR)

> reaction.time[sample(1:nrow(reaction.time), 10), ]

## 1부터 reaction.time의 행 개수(60)까지 중 10개의 열 전체 비복원추출

   age gender control time

9 16-24 F T 1.382461

38 25+ M C 1.245497

36 25+ M C 1.293425

56 25+ M C 1.442599

52 25+ F C 1.316956

47 25+ F C 1.522563

58 25+ F T 1.614979

43 25+ F T 1.499246

16 16-24 M C 1.357869

60 25+ M T 1.466591

 

> reaction.time[sample(1:nrow(reaction.time), 10), c("gender", "time")]

## 응용: 비복원추출 후 일부 변수()만 추출

   gender time

43 F 1.499246

47 F 1.522563

36 M 1.293425

3 M 1.512036

49 F 1.313935

13 M 1.369171

1 F 1.360075

48 M 1.462412

34 F 1.447160

26 F 1.472212

>

>

> #### 3.2 데이터 프레임에서 새로운 변수 추가 및 삭제 ####

>

> # 3.2.1 데이터 프레임에서 새로운 변수 추가 #

>

> #$기호를 이용

> name <- c("Cha", "Park", "Jung", "Kim", "Lee")

> rScore <- c(58, 66, 92, 78, 88)

> pythonScore <- c(88, 55, 98, 75, 58)

> javaScore <- c(66, 88, 90, 78, 66)

> record <- data.frame(name, rScore, pythonScore, javaScore, stringsAsFactors = FALSE)

> record

   name rScore pythonScore javaScore

1 Cha 58 88 66

2 Park 66 55 88

3 Jung 92 98 90

4 Kim 78 75 78

5 Lee 88 58 66

> str(record)

  'data.frame': 5 obs. of 4 variables:

$ name : chr "Cha" "Park" "Jung" "Kim" ...

$ rScore : num 58 66 92 78 88

$ pythonScore: num 88 55 98 75 58

$ javaScore : num 66 88 90 78 66

>

> record$sumScore <- record$rScore + record$pythonScore + record$javaScore

## 여기서 record$를 제외할 경우 sumScore라는 별도의 변수가 생성

> record$meanScore <- (record$rScore + record$pythonScore + record$javaScore)/3

## , 데이터 프레임의 변수가 아닌 R에서의 변수로 나오게 됨

> record

   name rScore pythonScore javaScore sumScore meanScore

1 Cha 58 88 66 212 70.66667

2 Park 66 55 88 209 69.66667

3 Jung 92 98 90 280 93.33333

4 Kim 78 75 78 231 77.00000

5 Lee 88 58 66 212 70.66667

>

> #within() 함수 이용

> within(record, {

+ sumScore <- rScore + pythonScore + javaScore

+ meanScore <- (rScore + pythonScore + javaScore)/3

+ }) ## 데이터 프레임명 기록하지 않아도 within() 함수로 변수 추가 가능

  name rScore pythonScore javaScore sumScore meanScore

1 Cha 58 88 66 212 70.66667

2 Park 66 55 88 209 69.66667

3 Jung 92 98 90 280 93.33333

4 Kim 78 75 78 231 77.00000

5 Lee 88 58 66 212 70.66667

>

>

> # 3.2.2 데이터 프레임에서 새로운 변수 삭제 #

> name <- c("Cha", "Park", "Jung", "Kim", "Lee")

> gender <- c("M", "F", "M", "F", "F")

> toeic <- c(750, 680, 990, 850, 900)

> gpa <- c(4.5, 3.8, 4.2, 3.2, 3.1)

> studentScore <- data.frame(name, gender, toeic, gpa, stringsAsFactors = FALSE)

> studentScore

   name gender toeic gpa

1 Cha M 750 4.5

2 Park F 680 3.8

3 Jung M 990 4.2

4 Kim F 850 3.2

5 Lee F 900 3.1

> subset(studentScore, select=c(-gender, -toeic))

## studentScore 데이터 프레임에서 gender, toeic 변수 삭제

  name gpa

1 Cha 4.5

2 Park 3.8

3 Jung 4.2

4 Kim 3.2

5 Lee 3.1

 

댓글