티스토리 뷰
데이터프레임
행과 열로 구성된 2차원 테이블 형태의 데이터 구조
데이터 프레임 생성
#data.frame()
> korea <- c(90,71,83)
> english <- c(85,78,79)
> math <- c(96,73,85)
> df <- data.frame(korea, english, math)
> df
korea english math
1 90 85 96
2 71 78 73
3 83 79 85
> str(df)
'data.frame': 3 obs. of 3 variables:
$ korea : num 90 71 83
$ english: num 85 78 79
$ math : num 96 73 85
> df_2 <- data.frame(korea <- c(90,71,83),
+ english <- c(85,78,79),
+ math <- c(96,73,85),
+ row.names=c('A01','A02','A03'))
> df_2
korea....c.90..71..83. english....c.85..78..79. math....c.96..73..85.
A01 90 85 96
A02 71 78 73
A03 83 79 85
>
> colnames(df_2)
[1] "korea....c.90..71..83." "english....c.85..78..79." "math....c.96..73..85."
> colnames(df_2) <- c("국어","영어","수학")
> df_2
국어 영어 수학
A01 90 85 96
A02 71 78 73
A03 83 79 85
> colnames(df_2)[1] #첫번째 열 이름 출력
[1] "국어"
> colnames(df_2)[2] #두번째 열 이름 출력
[1] "영어"
> #세번째 열 이름 변경
> colnames(df_2)[3] <- "MATH"
> df_2
국어 영어 MATH
A01 90 85 96
A02 71 78 73
A03 83 79 85
#행렬과 리스트에서 데이터 프레임으로(as.data.frame())
> m <- matrix(c(80,75,76,81,78,73,83,79,75), ncol =3)
> m
[,1] [,2] [,3]
[1,] 80 81 83
[2,] 75 78 79
[3,] 76 73 75
> class(m)
[1] "matrix" "array"
>
> df_m <- as.data.frame(m)
> df_m
V1 V2 V3
1 80 81 83
2 75 78 79
3 76 73 75
> class(df_m)
[1] "data.frame"
>
> colnames(df_m) <- c("국어","영어","수학")
> df_m
국어 영어 수학
1 80 81 83
2 75 78 79
3 76 73 75
#리스트 -> 데이터 프레임
> lst <- list(korea <- c(80,75,76),
+ english <- c(81,78,73),
+ math <- c(83,79,75))
> lst
[[1]]
[1] 80 75 76
[[2]]
[1] 81 78 73
[[3]]
[1] 83 79 75
> df_l <- as.data.frame(lst)
> colnames(df_l) <- c("국어","영어","수학")
> df_l
국어 영어 수학
1 80 81 83
2 75 78 79
3 76 73 75
#리스트 -> 데이터 프레임 오류 : 각 요소의 길이가 같아야 변경이 가능
> lst <- list(korea <- c(80,75,76,71,68),
+ english <- c(81,78,73),
+ math <- c(83,79,75,90))
> lst
[[1]]
[1] 80 75 76 71 68
[[2]]
[1] 81 78 73
[[3]]
[1] 83 79 75 90
>
> df_l <- as.data.frame(lst) #오류:각 요소의 길이가 같아야 변경이 가능
Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, :
arguments imply differing number of rows: 5, 3, 4
2. 데이터 프레임 인덱싱
> korea <- c(90,71,83,77,98)
> english <- c(85,78,79,65,77)
> math <- c(96,73,85,88,90)
> df <- data.frame(korea, english, math)
> df
korea english math
1 90 85 96
2 71 78 73
3 83 79 85
4 77 65 88
5 98 77 90
> str(df)
'data.frame': 5 obs. of 3 variables:
$ korea : num 90 71 83 77 98
$ english: num 85 78 79 65 77
$ math : num 96 73 85 88 90
> df$korea
[1] 90 71 83 77 98
> df$english
[1] 85 78 79 65 77
> df$math
[1] 96 73 85 88 90
> df$korea[1]
[1] 90
> df$korea[2:4]
[1] 71 83 77
> df$korea[c(1,2,5)]
[1] 90 71 98
> df$korea[1] <- 10
> df
korea english math
1 10 85 96
2 71 78 73
3 83 79 85
4 77 65 88
5 98 77 90
> df[1,] #1 행
korea english math
1 10 85 96
> df[2,] #2 행
korea english math
2 71 78 73
> df[3,] #3 행
korea english math
3 83 79 85
>
> df[,1] #1번째 열
[1] 10 71 83 77 98
> df[,2] #2번째 열
[1] 85 78 79 65 77
> df[,3] #3번째 열
[1] 96 73 85 88 90
>
> df[1,1] #1열의 1행
[1] 10
> df[3,3] #3열의 3행
[1] 85
>
> df[1:3,] #1~3열의 1~3행
korea english math
1 10 85 96
2 71 78 73
3 83 79 85
>
> df[c(1,5),c(1,3)] #1과 3열의 1과 5행
korea math
1 10 96
5 98 90
>
> df[c(1,5),c(1,3)] <- 0 #1과 3열의 1과 5행 값 0으로 변경
> df
korea english math
1 0 85 0
2 71 78 73
3 83 79 85
4 77 65 88
5 0 77 0
> df[1:3,] <- 100 #1~3열의 1~3행 값 100으로 변경
> df
korea english math
1 100 100 100
2 100 100 100
3 100 100 100
4 77 65 88
5 0 77 0
3. 데이터 프레임 결합하기
데이터 프레임 결합
> midterm <- data.frame(mid = c(86, 92, 88, 94))
> midterm
mid
1 86
2 92
3 88
4 94
> final <- data.frame(fin = c(83, 96, 94, 91))
> final
fin
1 83
2 96
3 94
4 91
> total <- cbind(midterm,final) #열 결합
> total
mid fin
1 86 83
2 92 96
3 88 94
4 94 91
> mid_1 <- data.frame(id= c(1,2,3,4), mid = c(86, 92, 88, 94))
> mid_1
id mid
1 1 86
2 2 92
3 3 88
4 4 94
> mid_2 <- data.frame(id= c(5,6,7,8), mid = c(90, 68, 83, 72))
> mid_2
id mid
1 5 90
2 6 68
3 7 83
4 8 72
>
> midterm <- rbind(mid_1, mid_2) #행 결합
> midterm
id mid
1 1 86
2 2 92
3 3 88
4 4 94
5 5 90
6 6 68
7 7 83
8 8 72
> midterm <- data.frame(id = c(1, 2, 5, 8), mid = c(86, 92, 88, 94))
> midterm
id mid
1 1 86
2 2 92
3 5 88
4 8 94
> final <- data.frame(id = c(1, 2, 3, 4), fin = c(83, 96, 94, 91))
> final
id fin
1 1 83
2 2 96
3 3 94
4 4 91
> total <- merge(midterm, final, by = "id") #key값에 의한 결합
> total
id mid fin
1 1 86 83
2 2 92 96
4. 데이터 프레임 함수
함수명 | 설명 |
colSums() | 행렬의 각 열별 합계 |
rowSum() | 행렬의 각 행별 합계 |
colMeans() | 행렬의 각 열별 평균 |
rowMean() | 행렬의 각 행별 평균 |
dim() | 행과 열의 개수 |
nrow() | 행의 개수 |
ncol() | 열의 개수 |
> colSums(df) #열 합계
korea english math
377 442 388
> colMeans(df) #열 평균
korea english math
75.4 88.4 77.6
> rowSums(df) #행 합계
[1] 300 300 300 230 77
> rowMeans(df) #행 평균
[1] 100.00000 100.00000 100.00000 76.66667 25.66667
> dim(df) #행과 열의 개수
[1] 5 3
> nrow(df) #행의 개수
[1] 5
> ncol(df) #열의 개수
[1] 3
> length(df) #벡터의 길이, dataframe의 열의 개수를 셀 때 사용하는 함수
[1] 3
data() #100여개의 내장 데이터셋 확인
data()
#iris 셋 가져와서 데이터 살펴 보기
> data(iris) #iris 데이터셋 블러오기
> str(iris)
'data.frame': 150 obs. of 5 variables:
$ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
$ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
$ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
$ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
> nrow(iris)
[1] 150
> ncol(iris)
[1] 5
> dim(iris)
[1] 150 5
> names(iris)
[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"
> 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
> head(iris,3)
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
> tail(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
145 6.7 3.3 5.7 2.5 virginica
146 6.7 3.0 5.2 2.3 virginica
147 6.3 2.5 5.0 1.9 virginica
148 6.5 3.0 5.2 2.0 virginica
149 6.2 3.4 5.4 2.3 virginica
150 5.9 3.0 5.1 1.8 virginica
> tail(iris,4)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
147 6.3 2.5 5.0 1.9 virginica
148 6.5 3.0 5.2 2.0 virginica
149 6.2 3.4 5.4 2.3 virginica
150 5.9 3.0 5.1 1.8 virginica
> summary(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100 setosa :50
1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300 versicolor:50
Median :5.800 Median :3.000 Median :4.350 Median :1.300 virginica :50
Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199
3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800
Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500
> View(iris)
728x90
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
반응형