3-6. 반복문, ifelse-binning + 빈도분석, 데이터합치기(rbind, cbind, merge)

반복문을 이용해 빈 리스트, 빈 메트릭스 만들고 채워넣기

# 1. 빈 리스트 만들고 채워넣기
a <- c()
a
## NULL
# 2. 빈 리스트에 1부터 10까지 채워넣기
for ( i in 1:10 ){
  a[i] <- i
}
a
##  [1]  1  2  3  4  5  6  7  8  9 10
# 3. 빈 matrix 만들기
m <- matrix(0, 10, 10) # matrix(넣을 값, m, n)
m
##       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
##  [1,]    0    0    0    0    0    0    0    0    0     0
##  [2,]    0    0    0    0    0    0    0    0    0     0
##  [3,]    0    0    0    0    0    0    0    0    0     0
##  [4,]    0    0    0    0    0    0    0    0    0     0
##  [5,]    0    0    0    0    0    0    0    0    0     0
##  [6,]    0    0    0    0    0    0    0    0    0     0
##  [7,]    0    0    0    0    0    0    0    0    0     0
##  [8,]    0    0    0    0    0    0    0    0    0     0
##  [9,]    0    0    0    0    0    0    0    0    0     0
## [10,]    0    0    0    0    0    0    0    0    0     0
# 4. 이중 반복문을 이용해 matrix 채워넣기
for ( i in 1:10 ){
  for ( j in 1:10){
    m[i, j] <- i*j
  }
}
m
##       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
##  [1,]    1    2    3    4    5    6    7    8    9    10
##  [2,]    2    4    6    8   10   12   14   16   18    20
##  [3,]    3    6    9   12   15   18   21   24   27    30
##  [4,]    4    8   12   16   20   24   28   32   36    40
##  [5,]    5   10   15   20   25   30   35   40   45    50
##  [6,]    6   12   18   24   30   36   42   48   54    60
##  [7,]    7   14   21   28   35   42   49   56   63    70
##  [8,]    8   16   24   32   40   48   56   64   72    80
##  [9,]    9   18   27   36   45   54   63   72   81    90
## [10,]   10   20   30   40   50   60   70   80   90   100

wakefield - r_data_frame으로 무작위 dataframe(tibble)만들기

ifelse로 바이닝하기(2번째 ifelse부터 조심)

범주형 데이터의 빈도분석

# install.packages("wakefield")
library(wakefield)

# 랜덤 데이터프레임 생성
temp_data <- r_data_frame(n=250,                     # n수
                          age( x=30:78, name="Age"),     # age() 랜덤
                          sex( x=c("male","female"),  prob=c(0.7,0.3), name="Sex") # sex랜덤과 비율
                        )
head(temp_data)
## # A tibble: 6 x 2
##     Age Sex  
##   <int> <fct>
## 1    75 male 
## 2    37 male 
## 3    45 male 
## 4    52 male 
## 5    31 male 
## 6    73 male
# ifelse로 Binning하기
# - 첫번째 else자리에만 Age로 인해 다 차있다. 2번째부터는 새로 생성한 칼럼명을 else자리에 넣어야한다. 왜냐하면, 2번째 조건인 40대에 안걸리면, 첫번째 조건 30대 것도 기존 Age(나이)가 다시 대입되어버린다. 앞에서 바꿔놓은 연령대(Age2)가 그대로 들어가야한다.
temp_data$Age2 <- ifelse( temp_data$Age >= 30 & temp_data$Age < 40, 3, temp_data$Age)
temp_data$Age2 <- ifelse( temp_data$Age >= 40 & temp_data$Age < 50, 4, temp_data$Age2)
temp_data$Age2 <- ifelse( temp_data$Age >= 50 & temp_data$Age < 60, 5, temp_data$Age2)
temp_data$Age2 <- ifelse( temp_data$Age >= 60 & temp_data$Age < 70, 6, temp_data$Age2)
temp_data$Age2 <- ifelse( temp_data$Age >= 70 & temp_data$Age < 80, 7, temp_data$Age2)

head(temp_data)
## # A tibble: 6 x 3
##     Age Sex    Age2
##   <int> <fct> <dbl>
## 1    75 male      7
## 2    37 male      3
## 3    45 male      4
## 4    52 male      5
## 5    31 male      3
## 6    73 male      7
# 범주형 Age2, sex의 빈도분석 by table, prop.table( table() )
# - 비율을 알려면, prop.table()안에 table()해놓은 것을 넣어야한다.
table( temp_data$Age2 )
## 
##  3  4  5  6  7 
## 48 54 62 52 34
prop.table(table( temp_data$Age2 ) )
## 
##     3     4     5     6     7 
## 0.192 0.216 0.248 0.208 0.136
table( temp_data$Sex )
## 
##   male female 
##    174     76
prop.table(table( temp_data$Sex ) )
## 
##   male female 
##  0.696  0.304

merge

# 데이터 만들기
df1<-data.frame(name = c('Park','Lee','Kim','Kang'),
                gender = c('f','m','f','m'))
df2<-data.frame(name = c('Min','Ahn','Choi','Kyeon'),
                gender = c('m','m','f','f'))

df1; df2 # 데이터 2개를 연달아서 확인하기 -> df1 과 df2는 name의 교집합 없음
##   name gender
## 1 Park      f
## 2  Lee      m
## 3  Kim      f
## 4 Kang      m
##    name gender
## 1   Min      m
## 2   Ahn      m
## 3  Choi      f
## 4 Kyeon      f
# 1. rbind(rowbind) 와 cbind(column bind)
rbind(df1,df2) # 행으로서 연결한다. (칼럼수, 칼럼명 같아야함)
##    name gender
## 1  Park      f
## 2   Lee      m
## 3   Kim      f
## 4  Kang      m
## 5   Min      m
## 6   Ahn      m
## 7  Choi      f
## 8 Kyeon      f
cbind(df1,df2) # 칼럼으로서 옆에 붙는다. (row수 같아야함)
##   name gender  name gender
## 1 Park      f   Min      m
## 2  Lee      m   Ahn      m
## 3  Kim      f  Choi      f
## 4 Kang      m Kyeon      f
df3<-data.frame(name = c('Yoon', 'Seo', 'Park', 'Lee', 'Kim', 'Kang'),
                age = c(30, 31, 22, 24, 28, 25))
df4<-data.frame(name = c('Park', 'Lee', 'Kim', 'Kang', 'Ahn', 'Go'),
                gender=c('f', 'f', 'm', 'm', 'f', 'm'),
                city = c('Seoul', 'Incheon', 'Seoul', 
                         'Busan', 'Gwangju', 'Deagu'))

df3;df4 # 6개 중에 4개 name은 겹친다.
##   name age
## 1 Yoon  30
## 2  Seo  31
## 3 Park  22
## 4  Lee  24
## 5  Kim  28
## 6 Kang  25
##   name gender    city
## 1 Park      f   Seoul
## 2  Lee      f Incheon
## 3  Kim      m   Seoul
## 4 Kang      m   Busan
## 5  Ahn      f Gwangju
## 6   Go      m   Deagu
merge(df3, df4, by="name" , all=FALSE) # all=FALSE는 Inner join으로서 교집합
##   name age gender    city
## 1 Kang  25      m   Busan
## 2  Kim  28      m   Seoul
## 3  Lee  24      f Incheon
## 4 Park  22      f   Seoul
merge(df3, df4, by="name" , all.x=TRUE) # all.x=TRUE는 LEFT join
##   name age gender    city
## 1 Kang  25      m   Busan
## 2  Kim  28      m   Seoul
## 3  Lee  24      f Incheon
## 4 Park  22      f   Seoul
## 5  Seo  31   <NA>    <NA>
## 6 Yoon  30   <NA>    <NA>
merge(df3, df4, by="name" , all.y=TRUE) # all.x=TRUE는 RIGHT join
##   name age gender    city
## 1 Kang  25      m   Busan
## 2  Kim  28      m   Seoul
## 3  Lee  24      f Incheon
## 4 Park  22      f   Seoul
## 5  Ahn  NA      f Gwangju
## 6   Go  NA      m   Deagu
merge(df3, df4, by="name" , all=TRUE) # all=TRUE Full outer join으로서 합집합
##   name age gender    city
## 1 Kang  25      m   Busan
## 2  Kim  28      m   Seoul
## 3  Lee  24      f Incheon
## 4 Park  22      f   Seoul
## 5  Seo  31   <NA>    <NA>
## 6 Yoon  30   <NA>    <NA>
## 7  Ahn  NA      f Gwangju
## 8   Go  NA      m   Deagu

+ Recent posts