티스토리 뷰

데이터프레임 
행과 열로 구성된 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
반응형