6 분 소요

r

1. 데이터 프레임

데이터프레임이란 행과 열이 여러 개 있는 데이터 집합이다. 행렬과 유사하게 보일 수 있지만, 반드시 각 열이 같은 타입일 필요는 없다는 것이 행렬과의 차이점이다. 뿐만 아니라 가장 보편적으로 사용하는 데이터셋 형식이기도 하다. 각 행은 데이터 레코드를, 각 열은 다양한 타입으로 구성된다.

2. 데이터프레임 생성하기

R 에서 데이터프레임을 생성하기 위해서는 data.frame() 함수를 사용해서 생성할 수 있다. 아래 예제는 각 열에 맞는 타입의 벡터를 사용해 데이터프레임을 생성하는 예제이다.

[R Code]

persons <- data.frame(Name = c("Ken", "Ashley", "Jennifer"),
Gender = c("Male", "Female", "Female"),
Age = c(24, 25, 22),
Major = c("Finance", "Statistics", "Computer Science"))
persons
[실행 결과]

Name Gender Age            Major
1      Ken   Male  24          Finance
2   Ashley Female  25       Statistics
3 Jennifer Female  22 Computer Science

위의 예제에서처럼 데이터프레임을 만드는 방법은 리스트를 만들 때와 동일하다. 근본적으로 데이터프레임은 테이블의 열을 나타내며, 같은 수의 원소를 갖는 벡터로 구성된 리스트이기 때문이다. 물론 위의 방식으로도 데이터프레임을 생성할 수 있지만, 원시적인 데이터로부터도 데이터프레임을 생성할 수 있다. 예를 들어, 앞서 만들었던 리스트를 이용해서 데이터프레임을 만드는 방법은 다음과 같이 as.data.frame() 함수를 사용하면 된다.

[R Code]

list1 <- list(x = c(1, 2, 3), y = c("a" ,"b", "c"))
data.frame(list1)
as.data.frame(list1)
[실행 결과]

x y
1 1 a
2 2 b
3 3 c

x y
1 1 a
2 2 b
3 3 c

실행결과를 비교해보면 알 수있듯이, 동일한 결과를 출력한다는 것을 확인할 수 있다. 리스트와 마찬가지로 행렬을 이용해서도 데이터프레임을 만들 수 있다.

[R Code]

matrix1 <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9), nrow = 3, byrow = FALSE)
data.frame(matrix1)
as.data.frame(matrix1)
[실행 결과]

  X1 X2 X3
1  1  4  7
2  2  5  8
3  3  6  9

  V1 V2 V3
1  1  4  7
2  2  5  8
3  3  6  9

3. 행과 열의 이름 짓기

앞서 언급한 데로, 데이터프레임은 리스트이면서 동시에 행렬과 비슷하다. 따라서 데이터프레임에서 데이터에 접근하는 방식은 리스트와 행렬의 방식 모두 사용할 수 있다.

[R Code]

df1 <- data.frame(id = 1:5, x = c(0, 2, 1, -1, 3), y = c(0.5, 0.2, 0.1, 0.5, 0.9))
df1
[실행 결과]

  id  x   y
1  1  0 0.5
2  2  2 0.2
3  3  1 0.1
4  4 -1 0.5
5  5  3 0.9

생성하는 것은 앞서 본 예제들과 유사하게 리스트 생성 방식과 유사하게 생성했다. 또한 행렬에서 행과 열의 이름을 변경하는 방식과 동일한 방식으로 변경하면 된다.

[R Code]

letters <- c("a", "b", "c", "d", "e")
colnames(df1) <- c("id", "level", "score")
rownames(df1) <- letters[1:5]
df1
[실행 결과]

  id level score
a  1     0   0.5
b  2     2   0.2
c  3     1   0.1
d  4    -1   0.5
e  5     3   0.9

4. 데이터프레임의 서브세팅

데이터프레임도 리스트의 성질을 갖고 있기 때문에 전체 데이터프레임에 대해서 요소 추출과 부분 집합 추출이 가능하다. 서브세팅하는 방법은 리스트 방식으로 하는 것과 행렬 방식으로 하는 것, 2가지가 존재한다.

1) 리스트 방식

데이터프레임을 벡터의 리스트로 간주하여 리스트 표기법을 따라 값을 추출하거나 부분집합을 추출할 수 있다. 방법은 리스트에서와 동일하게 $ 기호를 사용해서 이름으로 열 값을 추출하거나, 이중 대괄호에 인덱스를 넣어줌으로써 데이터에 접근하는 것이 가능하다.

[R Code]

df1$id
df1[[1]]
[실행 결과]

[1] 1 2 3 4 5
[1] 1 2 3 4 5

부분 집합 연산자인 대괄호 ([ ]) 에 수치형 백터를 사용해서 위치별로 열을 추출하거나, 문자형 벡터를 사용해서 이름으로 열을 추출하거나, 논리형 벡터를 사용해서 TRUE, FALSE 로 열을 추출할 수도 있다.

[R Code]

df1[1]
df1[1:2]
df1["score"]
df1[c("id", "score")]
df1[c(TRUE, FALSE, TRUE)]
[실행 결과]

  id
a  1
b  2
c  3
d  4
e  5

  id level
a  1     0
b  2     2
c  3     1
d  4    -1
e  5     3

  score
a   0.5
b   0.2
c   0.1
d   0.5
e   0.9

  id score
a  1   0.5
b  2   0.2
c  3   0.1
d  4   0.5
e  5   0.9

  id score
a  1   0.5
b  2   0.2
c  3   0.1
d  4   0.5
e  5   0.9

2) 행렬 방식

위의 실행결과를 보면 알 수 있듯이, 리스트 방식으로는 열 단위로 출력해줄 뿐, 행 단위로 선택되지 않는다. 이와 달리 행렬 표기법의 경우 리스트에 비해 좀 더 유연한 기능을 제공한다. 데이터프레임을 행렬과 같이 생각해본다면 열과 행 모두 선택할 수 있으며, 추출하고자 하는 부분집합도 리스트에 비해 원활하게 추출할 수 있다.

[R Code]

df1[, "level"]
df1[, c("id", "level")]
df1[, 1:2]
df1[1:4, ]
df1[c("c", "e"), ]
df1[1:4, "id"]
df1[1:4, c("id", "level")]
[실행 결과]

[1]  0  2  1 -1  3

  id level
a  1     0
b  2     2
c  3     1
d  4    -1
e  5     3

  id level
a  1     0
b  2     2
c  3     1
d  4    -1
e  5     3

  id level score
a  1     0   0.5
b  2     2   0.2
c  3     1   0.1
d  4    -1   0.5

  id level score
c  3     1   0.1
e  5     3   0.9

[1] 1 2 3 4

  id level
a  1     0
b  2     2
c  3     1
d  4    -1

다만, 행렬 표기법을 사용하면 출력이 자동으로 단순화된다는 점을 주의하자. 1개 열만 선택하면 결과는 데이터프레임으로 출력되지 않고, 해당 열의 값으로 출력되기 때문에 만약 데이터프레임으로 유지하면서 1개 열만 출력하고 싶다면, 아래와 같이 작성하면 된다.

[R Code]

df1[1:4,]["id"]
[실행 결과]

  id
a  1
b  2
c  3
d  4

코드의 원리를 설명하자면, 먼저 [1:4,] 부분을 통해 데이터프레임의 부분집합을 계산한다. 이 때 출력되는 결과 역시 데이터프레임이기 때문에, [“id”] 로 표시를 해도 데이터프레임의 해당 열을 출력하는 것이기 때문에 결과적으로 데이터프레임 형식을 유지하면서 1개 열만 출력한 것과 동일한 효과를 갖는다. 위의 방법 이외에 옵션 값 중 drop=FASLE 로 지정하면 된다. 사용하는 방법은 아래 코드와 같다.

[R Code]

df1[1:4, "id", drop=FALSE]
[실행 결과]

  id
a  1
b  2
c  3
d  4

따라서 만약 데이터프레임 형식을 결과를 이용해 계속 연산을 하는 경우라면, 위의 2가지 방법 중 하나는 무조건 사용해줘야하며, 만약 없을 경우에는 출력결과가 벡터로도 출력될 수 있음을 명심하자. 끝으로, 만약 데이터프레임에서 원하는 조건의 값만 출력하고싶다면, 아래와 같이 코드를 작성하면 된다.

[R Code]

df1$score >= 0.5
df1[df1$score >= 0.5, c("id", "level")]
[실행 결과]

[1]  TRUE FALSE FALSE  TRUE  TRUE

  id level
a  1     0
d  4    -1
e  5     3

위의 결과와 동일한 결과를 얻기 위해 아래와 같이 코드를 작성해도 된다.

[R Code]

rownames(df1) %in% c("a", "d", "e")
df1[rownames(df1) %in% c("a", "d", "e"), c("id", "level")]
[실행 결과]

[1]  TRUE FALSE FALSE  TRUE  TRUE

  id level
a  1     0
d  4    -1
e  5     3

이처럼 기본적으로 행을 선택할 때는 논리형 벡터를 사용하고, 열을 선택할 때 문자형 벡터를 사용하는 방법으로 코드를 작성하면 된다.

5. 값 설정하기

데이터프레임의 특정 위치에 값을 설정하는 방식도 마찬가지로 리스트 방식과 행렬 방식으로 대입할 수 있다. 먼저 리스트 형식으로 값을 대임하는 방법은 아래 코드와 같다.

[R Code]

df1$score <- c(0.6, 0.3, 0.2, 0.4, 0.8)
df1

df1["score"] <- c(0.8, 0.5, 0.4, 0.1, 0.9)
df1

df1[["score"]] <- c(0.4, 0.2, 0.3, 0.5, 0.8)
df1

df1[c("level", "score")] <- list(level=c(1, 2, 1, 0, 0), score=c(0.1, 0.2, 0.3, 0.4, 0.5))
df1
[실행 결과]

  id level score
a  1     0   0.6
b  2     2   0.3
c  3     1   0.2
d  4    -1   0.4
e  5     3   0.8

  id level score
a  1     0   0.8
b  2     2   0.5
c  3     1   0.4
d  4    -1   0.1
e  5     3   0.9

  id level score
a  1     0   0.4
b  2     2   0.2
c  3     1   0.3
d  4    -1   0.5
e  5     3   0.8

  id level score
a  1     1   0.1
b  2     2   0.2
c  3     1   0.3
d  4     0   0.4
e  5     0   0.5

위의 코드처럼 리스트 형식으로 각 열에 맞는 값을 대입하거나, 혹은 대괄호를 사용해서 대입할 수 있다. 다만, 대괄호는 부분집합을 의미하기 때문에 여러 열에 대한 값을 대입할 수 있지만, 이중 대괄호는 1개 열만을 의미하기 때문에 해당 열에 해당하는 값만 수정할 수 있다. 다음으로 행렬 형식으로 값을 설정해보자. 앞서 언급한 것처럼 리스트 방식으로 값을 설정하게되면 열 단위로만 수정할 수 있다는 제약이 생길 수 있으며, 행렬 방식으로 설정하면 값을 설정할 때, 좀 더 유연하게 설정해줄 수 있다.

[R Code]

df1[1:3, "level"] <- c(-1, 0, 1)
df1

df1[1:2, c("level", "score")] <- list(level= c(0, 0), score = c(0.9, 1.0))
df1
[실행 결과]

  id level score
a  1    -1   0.1
b  2     0   0.2
c  3     1   0.3
d  4     0   0.4
e  5     0   0.5

  id level score
a  1     0   0.9
b  2     0   1.0
c  3     1   0.3
d  4     0   0.4
e  5     0   0.5

태그: ,

카테고리:

업데이트:

댓글남기기