본문 바로가기
R

[R] 데이터 개념 이해하기(2)

by 빵으니 2020. 7. 3.
Chap02

데이터 개념 이해하기

벡터 만들기

In [1]:
a1 <- c(1,2,3,4,5)
a1
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
In [2]:
is(a1)
  1. 'numeric'
  2. 'vector'
In [3]:
a2 <- c(1L,2L,3L)
a2
  1. 1
  2. 2
  3. 3
In [4]:
is(a2)
  1. 'integer'
  2. 'double'
  3. 'numeric'
  4. 'vector'
  5. 'data.frameRowLabels'
In [5]:
a3 <- as.integer(a1)
a3
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
In [6]:
is(a3)
  1. 'integer'
  2. 'double'
  3. 'numeric'
  4. 'vector'
  5. 'data.frameRowLabels'
In [7]:
b <- c(1.23, 3.14, 6.66)
b
  1. 1.23
  2. 3.14
  3. 6.66
In [8]:
c1 <- c('a','b','c','a')
c1
  1. 'a'
  2. 'b'
  3. 'c'
  4. 'a'
In [9]:
is(c1)
  1. 'character'
  2. 'vector'
  3. 'data.frameRowLabels'
  4. 'SuperClassMethod'
In [10]:
c2 <- c(1,2,3,'z')
c2
  1. '1'
  2. '2'
  3. '3'
  4. 'z'
In [11]:
is(c2)
  1. 'character'
  2. 'vector'
  3. 'data.frameRowLabels'
  4. 'SuperClassMethod'
In [12]:
# 명목형 벡터로 변환
d1 <- as.factor(c1)
d1
  1. a
  2. b
  3. c
  4. a
Levels:
  1. 'a'
  2. 'b'
  3. 'c'
In [13]:
is(d1)
  1. 'factor'
  2. 'integer'
  3. 'oldClass'
  4. 'double'
  5. 'numeric'
  6. 'vector'
  7. 'data.frameRowLabels'

data frame 만들기

  • 벡터들의 갯수가 같아야 한다
In [14]:
a1 <- c(1,2,3,4,5)
b1 <- c('a','b','c','d','e')
c1 <- c(1.1, 2.2, 3.3, 4.4, 5.5)
In [15]:
df1 <- data.frame(a1, b1, c1)
df1
a1b1c1
1 a 1.1
2 b 2.2
3 c 3.3
4 d 4.4
5 e 5.5
In [16]:
# 데이터 프레임 이름 설정하기
df2 <- data.frame(count=a1, name=b1,meanCount=c1)
df2
countnamemeanCount
1 a 1.1
2 b 2.2
3 c 3.3
4 d 4.4
5 e 5.5

외부 데이터 가져오기 예제

In [7]:
# csv 파일 불러오기
df_csv <- read.csv('R-ggagi-data/example_studentlist.csv')
# df_csv <- read.csv('R-ggagi-data/example_studentlist.csv', header=F)
In [10]:
df_csv
namesexagegradeabsencebloodtypeheightweight
김길동남자 23 3 O 165.3 68.2
이미린여자 22 2 AB 170.1 53.0
홍길동남자 24 4 B 175.0 80.1
김철수남자 23 3 AB 182.1 85.7
손세수여자 20 1 A 168.0 49.5
박미희여자 21 2 O 162.0 52.0
강수친여자 22 1 O 155.2 45.3
이희수여자 23 1 A 176.9 55.0
이철린남자 23 3 B 178.5 64.2
방희철남자 22 2 B 176.1 61.3
박수호남자 24 4 O 167.1 62.0
임동민남자 22 2 AB 180.0 75.8
김민수남자 21 1 A 162.2 55.3
이희진여자 23 3 O 176.1 53.1
김미진여자 22 2 B 158.2 45.2
김동수남자 24 4 B 168.6 70.2
여수근남자 21 1 A 169.2 62.2
In [12]:
# 컬럼 뽑아오기
df_csv$height
  1. 165.3
  2. 170.1
  3. 175
  4. 182.1
  5. 168
  6. 162
  7. 155.2
  8. 176.9
  9. 178.5
  10. 176.1
  11. 167.1
  12. 180
  13. 162.2
  14. 176.1
  15. 158.2
  16. 168.6
  17. 169.2
In [14]:
#벡터 확인
is.vector(df_csv$height)
TRUE
In [15]:
# 데이터 프레임 구조 파악
str(df_csv)
'data.frame':	17 obs. of  8 variables:
 $ name     : Factor w/ 17 levels "강수친","김길동",..: 2 12 17 6 10 7 1 14 13 9 ...
 $ sex      : Factor w/ 2 levels "남자","여자": 1 2 1 1 2 2 2 2 1 1 ...
 $ age      : int  23 22 24 23 20 21 22 23 23 22 ...
 $ grade    : int  3 2 4 3 1 2 1 1 3 2 ...
 $ absence  : Factor w/ 2 levels "무","유": 2 1 1 1 2 1 1 1 1 1 ...
 $ bloodtype: Factor w/ 4 levels "A","AB","B","O": 4 2 3 2 1 4 4 1 3 3 ...
 $ height   : num  165 170 175 182 168 ...
 $ weight   : num  68.2 53 80.1 85.7 49.5 52 45.3 55 64.2 61.3 ...
In [16]:
# 변수선택 방법 1  (컬럼명)
df_csv$height
  1. 165.3
  2. 170.1
  3. 175
  4. 182.1
  5. 168
  6. 162
  7. 155.2
  8. 176.9
  9. 178.5
  10. 176.1
  11. 167.1
  12. 180
  13. 162.2
  14. 176.1
  15. 158.2
  16. 168.6
  17. 169.2
In [17]:
# 변수선택 방법 2  (인덱스-R은 인덱싱 1부터)
df_csv[[7]]
  1. 165.3
  2. 170.1
  3. 175
  4. 182.1
  5. 168
  6. 162
  7. 155.2
  8. 176.9
  9. 178.5
  10. 176.1
  11. 167.1
  12. 180
  13. 162.2
  14. 176.1
  15. 158.2
  16. 168.6
  17. 169.2
In [18]:
# 변수선택 방법 3 
df_csv[7]
height
165.3
170.1
175.0
182.1
168.0
162.0
155.2
176.9
178.5
176.1
167.1
180.0
162.2
176.1
158.2
168.6
169.2
In [20]:
# 벡터와 데이터프레임 차이를 파악해두기
is(df_csv$height)
is(df_csv[[7]])
is(df_csv[7])
  1. 'numeric'
  2. 'vector'
  1. 'numeric'
  2. 'vector'
  1. 'data.frame'
  2. 'list'
  3. 'oldClass'
  4. 'vector'
  5. 'listOrNULL'
In [24]:
# 여러개의 변수 선택 1 / c 사용
df_csv[c(6,7)]
bloodtypeheight
O 165.3
AB 170.1
B 175.0
AB 182.1
A 168.0
O 162.0
O 155.2
A 176.9
B 178.5
B 176.1
O 167.1
AB 180.0
A 162.2
O 176.1
B 158.2
B 168.6
A 169.2
In [25]:
# 여러개의 변수 선택 2
df_csv[c('bloodtype','height')]
bloodtypeheight
O 165.3
AB 170.1
B 175.0
AB 182.1
A 168.0
O 162.0
O 155.2
A 176.9
B 178.5
B 176.1
O 167.1
AB 180.0
A 162.2
O 176.1
B 158.2
B 168.6
A 169.2
In [28]:
# 행, 열 방식으로 가져오기
# 행은 다 가져오고, 열은 7번째 가져와!
df_csv[,7]
  1. 165.3
  2. 170.1
  3. 175
  4. 182.1
  5. 168
  6. 162
  7. 155.2
  8. 176.9
  9. 178.5
  10. 176.1
  11. 167.1
  12. 180
  13. 162.2
  14. 176.1
  15. 158.2
  16. 168.6
  17. 169.2
In [30]:
df_csv[2,]
namesexagegradeabsencebloodtypeheightweight
2이미린여자 22 2 AB 170.1 53
In [31]:
df_csv[2,1]
이미린
Levels:
  1. '강수친'
  2. '김길동'
  3. '김동수'
  4. '김미진'
  5. '김민수'
  6. '김철수'
  7. '박미희'
  8. '박수호'
  9. '방희철'
  10. '손세수'
  11. '여수근'
  12. '이미린'
  13. '이철린'
  14. '이희수'
  15. '이희진'
  16. '임동민'
  17. '홍길동'
In [33]:
df_raw2 = df_csv[2,]
In [35]:
df_raw2[1] # 데이터가 아닌 데이터 프레임을 가져옴
name
2이미린
In [37]:
df_raw2[[1]] # 데이터만 가져옴
이미린
Levels:
  1. '강수친'
  2. '김길동'
  3. '김동수'
  4. '김미진'
  5. '김민수'
  6. '김철수'
  7. '박미희'
  8. '박수호'
  9. '방희철'
  10. '손세수'
  11. '여수근'
  12. '이미린'
  13. '이철린'
  14. '이희수'
  15. '이희진'
  16. '임동민'
  17. '홍길동'
In [47]:
# 데이터만 가져오기
df_csv <- read.csv('R-ggagi-data/example_studentlist.csv', stringsAsFactors = FALSE)
In [48]:
df_csv[2,1]
'이미린'
In [49]:
# 검색 목록
search()
  1. '.GlobalEnv'
  2. 'df_csv'
  3. 'jupyter:irkernel'
  4. 'package:stats'
  5. 'package:graphics'
  6. 'package:grDevices'
  7. 'package:utils'
  8. 'package:datasets'
  9. 'package:methods'
  10. 'Autoloads'
  11. 'package:base'
In [64]:
# 검색목록에 추가
attach(df_csv)
In [65]:
# 변수명으로 바로 사용 가능
height
  1. 165.3
  2. 170.1
  3. 175
  4. 182.1
  5. 168
  6. 162
  7. 155.2
  8. 176.9
  9. 178.5
  10. 176.1
  11. 167.1
  12. 180
  13. 162.2
  14. 176.1
  15. 158.2
  16. 168.6
  17. 169.2
In [66]:
search()
  1. '.GlobalEnv'
  2. 'df_csv'
  3. 'jupyter:irkernel'
  4. 'package:stats'
  5. 'package:graphics'
  6. 'package:grDevices'
  7. 'package:utils'
  8. 'package:datasets'
  9. 'package:methods'
  10. 'Autoloads'
  11. 'package:base'
In [67]:
# 검색목록에서 삭제
detach(df_csv)
In [68]:
search()
  1. '.GlobalEnv'
  2. 'jupyter:irkernel'
  3. 'package:stats'
  4. 'package:graphics'
  5. 'package:grDevices'
  6. 'package:utils'
  7. 'package:datasets'
  8. 'package:methods'
  9. 'Autoloads'
  10. 'package:base'

subset() : 조건으로 변수 선택

In [71]:
# 조건으로 변수 선택 subset()
# 키가 170보다 큰 관측치 - subset =
subset(df_csv, subset = (height >170))
namesexagegradeabsencebloodtypeheightweight
2이미린여자 22 2 AB 170.1 53.0
3홍길동남자 24 4 B 175.0 80.1
4김철수남자 23 3 AB 182.1 85.7
8이희수여자 23 1 A 176.9 55.0
9이철린남자 23 3 B 178.5 64.2
10방희철남자 22 2 B 176.1 61.3
12임동민남자 22 2 AB 180.0 75.8
14이희진여자 23 3 O 176.1 53.1

select : 변수 선택해서 취하거나 버리기

In [73]:
# 특정변수 빼고 보기 - select = 
subset(df_csv, select = -height)
namesexagegradeabsencebloodtypeweight
김길동남자 23 3 O 68.2
이미린여자 22 2 AB 53.0
홍길동남자 24 4 B 80.1
김철수남자 23 3 AB 85.7
손세수여자 20 1 A 49.5
박미희여자 21 2 O 52.0
강수친여자 22 1 O 45.3
이희수여자 23 1 A 55.0
이철린남자 23 3 B 64.2
방희철남자 22 2 B 61.3
박수호남자 24 4 O 62.0
임동민남자 22 2 AB 75.8
김민수남자 21 1 A 55.3
이희진여자 23 3 O 53.1
김미진여자 22 2 B 45.2
김동수남자 24 4 B 70.2
여수근남자 21 1 A 62.2
In [75]:
# 특정변수 여러개 빼고 보기 - select = 
subset(df_csv, select = c(-height, -weight))
namesexagegradeabsencebloodtype
김길동남자 23 3 O
이미린여자 22 2 AB
홍길동남자 24 4 B
김철수남자 23 3 AB
손세수여자 20 1 A
박미희여자 21 2 O
강수친여자 22 1 O
이희수여자 23 1 A
이철린남자 23 3 B
방희철남자 22 2 B
박수호남자 24 4 O
임동민남자 22 2 AB
김민수남자 21 1 A
이희진여자 23 3 O
김미진여자 22 2 B
김동수남자 24 4 B
여수근남자 21 1 A

colname() : 변수명 바꾸기

In [76]:
# 변수명 확인하기
colnames(df_csv)
  1. 'name'
  2. 'sex'
  3. 'age'
  4. 'grade'
  5. 'absence'
  6. 'bloodtype'
  7. 'height'
  8. 'weight'
In [78]:
# 변수명 바꾸기
colnames(df_csv)[6] <- 'blood'  # 6번째 변수명 수정
df_csv
namesexagegradeabsencebloodheightweight
김길동남자 23 3 O 165.3 68.2
이미린여자 22 2 AB 170.1 53.0
홍길동남자 24 4 B 175.0 80.1
김철수남자 23 3 AB 182.1 85.7
손세수여자 20 1 A 168.0 49.5
박미희여자 21 2 O 162.0 52.0
강수친여자 22 1 O 155.2 45.3
이희수여자 23 1 A 176.9 55.0
이철린남자 23 3 B 178.5 64.2
방희철남자 22 2 B 176.1 61.3
박수호남자 24 4 O 167.1 62.0
임동민남자 22 2 AB 180.0 75.8
김민수남자 21 1 A 162.2 55.3
이희진여자 23 3 O 176.1 53.1
김미진여자 22 2 B 158.2 45.2
김동수남자 24 4 B 168.6 70.2
여수근남자 21 1 A 169.2 62.2
In [88]:
# 모든 변수명 바꾸기

df_csv <- read.csv('R-ggagi-data/example_studentlist.csv')

old_list <- colnames(df_csv)
new_list <- c('na','se','ag','gr','ab','bl','he','we')
colnames(df_csv) <- new_list
head(df_csv)
colnames(df_csv) <- old_list
head(df_csv)
naseaggrabblhewe
김길동남자 23 3 O 165.3 68.2
이미린여자 22 2 AB 170.1 53.0
홍길동남자 24 4 B 175.0 80.1
김철수남자 23 3 AB 182.1 85.7
손세수여자 20 1 A 168.0 49.5
박미희여자 21 2 O 162.0 52.0
namesexagegradeabsencebloodtypeheightweight
김길동남자 23 3 O 165.3 68.2
이미린여자 22 2 AB 170.1 53.0
홍길동남자 24 4 B 175.0 80.1
김철수남자 23 3 AB 182.1 85.7
손세수여자 20 1 A 168.0 49.5
박미희여자 21 2 O 162.0 52.0

cbind() : 새로운 변수 추가

In [89]:
bmi <- df_csv$weight/df_csv$height^2
bmi
  1. 0.00249596601387274
  2. 0.00183175439560572
  3. 0.00261551020408163
  4. 0.0025844071288624
  5. 0.00175382653061224
  6. 0.00198140527358634
  7. 0.00188067940269954
  8. 0.00175754730758132
  9. 0.00201492361650543
  10. 0.00197670455296649
  11. 0.00222043870854987
  12. 0.00233950617283951
  13. 0.00210195508429866
  14. 0.00171228404180295
  15. 0.00180603214737222
  16. 0.00246957358696065
  17. 0.0021726494866679
In [90]:
df_bmi <- cbind(df_csv,bmi)
df_bmi
namesexagegradeabsencebloodtypeheightweightbmi
김길동 남자 23 3 O 165.3 68.2 0.002495966
이미린 여자 22 2 AB 170.1 53.0 0.001831754
홍길동 남자 24 4 B 175.0 80.1 0.002615510
김철수 남자 23 3 AB 182.1 85.7 0.002584407
손세수 여자 20 1 A 168.0 49.5 0.001753827
박미희 여자 21 2 O 162.0 52.0 0.001981405
강수친 여자 22 1 O 155.2 45.3 0.001880679
이희수 여자 23 1 A 176.9 55.0 0.001757547
이철린 남자 23 3 B 178.5 64.2 0.002014924
방희철 남자 22 2 B 176.1 61.3 0.001976705
박수호 남자 24 4 O 167.1 62.0 0.002220439
임동민 남자 22 2 AB 180.0 75.8 0.002339506
김민수 남자 21 1 A 162.2 55.3 0.002101955
이희진 여자 23 3 O 176.1 53.1 0.001712284
김미진 여자 22 2 B 158.2 45.2 0.001806032
김동수 남자 24 4 B 168.6 70.2 0.002469574
여수근 남자 21 1 A 169.2 62.2 0.002172649

merge() : 2개의 데이터프레임 합치기

In [91]:
df_1 <- read.csv('R-ggagi-data//example_studentlist.csv')
df_2 <- read.csv('R-ggagi-data//omit.csv')
df_1
df_2
namesexagegradeabsencebloodtypeheightweight
김길동남자 23 3 O 165.3 68.2
이미린여자 22 2 AB 170.1 53.0
홍길동남자 24 4 B 175.0 80.1
김철수남자 23 3 AB 182.1 85.7
손세수여자 20 1 A 168.0 49.5
박미희여자 21 2 O 162.0 52.0
강수친여자 22 1 O 155.2 45.3
이희수여자 23 1 A 176.9 55.0
이철린남자 23 3 B 178.5 64.2
방희철남자 22 2 B 176.1 61.3
박수호남자 24 4 O 167.1 62.0
임동민남자 22 2 AB 180.0 75.8
김민수남자 21 1 A 162.2 55.3
이희진여자 23 3 O 176.1 53.1
김미진여자 22 2 B 158.2 45.2
김동수남자 24 4 B 168.6 70.2
여수근남자 21 1 A 169.2 62.2
namefootsize
강수친245
김길동270
김동수265
김미진235
김민수270
김철수280
박미희240
박수호 NA
방희철275
손세수240
여수근265
이미린245
이철린 NA
이희수245
이희진245
임동민280
홍길동275
In [92]:
df_merge <- merge(df_1, df_2, by='name')
df_merge
namesexagegradeabsencebloodtypeheightweightfootsize
강수친여자 22 1 O 155.2 45.3 245
김길동남자 23 3 O 165.3 68.2 270
김동수남자 24 4 B 168.6 70.2 265
김미진여자 22 2 B 158.2 45.2 235
김민수남자 21 1 A 162.2 55.3 270
김철수남자 23 3 AB 182.1 85.7 280
박미희여자 21 2 O 162.0 52.0 240
박수호남자 24 4 O 167.1 62.0 NA
방희철남자 22 2 B 176.1 61.3 275
손세수여자 20 1 A 168.0 49.5 240
여수근남자 21 1 A 169.2 62.2 265
이미린여자 22 2 AB 170.1 53.0 245
이철린남자 23 3 B 178.5 64.2 NA
이희수여자 23 1 A 176.9 55.0 245
이희진여자 23 3 O 176.1 53.1 245
임동민남자 22 2 AB 180.0 75.8 280
홍길동남자 24 4 B 175.0 80.1 275

rbind() : 행으로 추가하기

  • 같은 이름의 열을 가지고 있어야 함
In [93]:
df_head <- head(df_merge)
df_tail <- tail(df_merge)
df_head
df_tail
namesexagegradeabsencebloodtypeheightweightfootsize
강수친여자 22 1 O 155.2 45.3 245
김길동남자 23 3 O 165.3 68.2 270
김동수남자 24 4 B 168.6 70.2 265
김미진여자 22 2 B 158.2 45.2 235
김민수남자 21 1 A 162.2 55.3 270
김철수남자 23 3 AB 182.1 85.7 280
namesexagegradeabsencebloodtypeheightweightfootsize
12이미린여자 22 2 AB 170.1 53.0 245
13이철린남자 23 3 B 178.5 64.2 NA
14이희수여자 23 1 A 176.9 55.0 245
15이희진여자 23 3 O 176.1 53.1 245
16임동민남자 22 2 AB 180.0 75.8 280
17홍길동남자 24 4 B 175.0 80.1 275
In [94]:
df_rbind <- rbind(df_head, df_tail)
df_rbind
namesexagegradeabsencebloodtypeheightweightfootsize
1강수친여자 22 1 O 155.2 45.3 245
2김길동남자 23 3 O 165.3 68.2 270
3김동수남자 24 4 B 168.6 70.2 265
4김미진여자 22 2 B 158.2 45.2 235
5김민수남자 21 1 A 162.2 55.3 270
6김철수남자 23 3 AB 182.1 85.7 280
12이미린여자 22 2 AB 170.1 53.0 245
13이철린남자 23 3 B 178.5 64.2 NA
14이희수여자 23 1 A 176.9 55.0 245
15이희진여자 23 3 O 176.1 53.1 245
16임동민남자 22 2 AB 180.0 75.8 280
17홍길동남자 24 4 B 175.0 80.1 275

list : 모든 종류의 데이터 객체 담기

In [95]:
df <- df_merge
n <- c(1:20)
s <- c('a','b','c')
b <- c(T,F,T,F,T)
tmp_list1 <- list(df,n,s,b,mean)
tmp_list1
  1. namesexagegradeabsencebloodtypeheightweightfootsize
    강수친여자 22 1 O 155.2 45.3 245
    김길동남자 23 3 O 165.3 68.2 270
    김동수남자 24 4 B 168.6 70.2 265
    김미진여자 22 2 B 158.2 45.2 235
    김민수남자 21 1 A 162.2 55.3 270
    김철수남자 23 3 AB 182.1 85.7 280
    박미희여자 21 2 O 162.0 52.0 240
    박수호남자 24 4 O 167.1 62.0 NA
    방희철남자 22 2 B 176.1 61.3 275
    손세수여자 20 1 A 168.0 49.5 240
    여수근남자 21 1 A 169.2 62.2 265
    이미린여자 22 2 AB 170.1 53.0 245
    이철린남자 23 3 B 178.5 64.2 NA
    이희수여자 23 1 A 176.9 55.0 245
    이희진여자 23 3 O 176.1 53.1 245
    임동민남자 22 2 AB 180.0 75.8 280
    홍길동남자 24 4 B 175.0 80.1 275
    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    1. 'a'
    2. 'b'
    3. 'c'
    1. TRUE
    2. FALSE
    3. TRUE
    4. FALSE
    5. TRUE
  2. function (x, ...) 
    UseMethod("mean")
In [96]:
# 이름 넣어서 만들기
tmp_list2 <- list(DataFrame=df, Number=n, String=s, Bool=b, Func=mean)
tmp_list2
$DataFrame
namesexagegradeabsencebloodtypeheightweightfootsize
강수친여자 22 1 O 155.2 45.3 245
김길동남자 23 3 O 165.3 68.2 270
김동수남자 24 4 B 168.6 70.2 265
김미진여자 22 2 B 158.2 45.2 235
김민수남자 21 1 A 162.2 55.3 270
김철수남자 23 3 AB 182.1 85.7 280
박미희여자 21 2 O 162.0 52.0 240
박수호남자 24 4 O 167.1 62.0 NA
방희철남자 22 2 B 176.1 61.3 275
손세수여자 20 1 A 168.0 49.5 240
여수근남자 21 1 A 169.2 62.2 265
이미린여자 22 2 AB 170.1 53.0 245
이철린남자 23 3 B 178.5 64.2 NA
이희수여자 23 1 A 176.9 55.0 245
이희진여자 23 3 O 176.1 53.1 245
임동민남자 22 2 AB 180.0 75.8 280
홍길동남자 24 4 B 175.0 80.1 275
$Number
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
$String
  1. 'a'
  2. 'b'
  3. 'c'
$Bool
  1. TRUE
  2. FALSE
  3. TRUE
  4. FALSE
  5. TRUE
$Func
function (x, ...) 
UseMethod("mean")
In [97]:
# 항목 삭제
tmp_list1[1] <- NULL
tmp_list1
    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    1. 'a'
    2. 'b'
    3. 'c'
    1. TRUE
    2. FALSE
    3. TRUE
    4. FALSE
    5. TRUE
  1. function (x, ...) 
    UseMethod("mean")
In [98]:
# 항목 선택
tmp_list2[2]
tmp_list2['Number']
$Number =
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
$Number =
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20

class() : 자료형 확인

  • 함수에 인자로 사용 시 주의
In [99]:
class(tmp_list1[1])
class(tmp_list1[[1]])
'list'
'integer'
In [100]:
class(tmp_list2[1])
class(tmp_list2[[1]])
'list'
'data.frame'
In [101]:
# 여러 개 항목 선택

# list
tmp_list2[c(2,3)]

# list
tmp_list2[c('Number','String')]

# integer
tmp_list2$Number

# character
tmp_list2$String
$Number
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
$String
  1. 'a'
  2. 'b'
  3. 'c'
$Number
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
$String
  1. 'a'
  2. 'b'
  3. 'c'
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  1. 'a'
  2. 'b'
  3. 'c'

split()

In [104]:
# 성별에 따른 키값을 리스트로 반환
height_sex <- split(df$height, df$sex) # 뒷 값에 따른 앞의 값
height_sex

# 데이터만
height_sex$여자
$남자
  1. 165.3
  2. 168.6
  3. 162.2
  4. 182.1
  5. 167.1
  6. 176.1
  7. 169.2
  8. 178.5
  9. 180
  10. 175
$여자
  1. 155.2
  2. 158.2
  3. 162
  4. 168
  5. 170.1
  6. 176.9
  7. 176.1
  1. 155.2
  2. 158.2
  3. 162
  4. 168
  5. 170.1
  6. 176.9
  7. 176.1
In [105]:
class(height_sex)
'list'

mean() : 리스트 평균 구하기

In [106]:
mean(height_sex)    # NA 없는 데이터가 있으면 평균을 내지 않는다
mean(height_sex[1])
mean(height_sex[[1]])
Warning message in mean.default(height_sex):
"argument is not numeric or logical: returning NA"
<NA>
Warning message in mean.default(height_sex[1]):
"argument is not numeric or logical: returning NA"
<NA>
172.41

sapply() : 리스트 항목별로 작업

In [107]:
# 리스트 항목별 평균 mean
height_sex_mean <- sapply(height_sex, mean)
height_sex_mean
height_sex_mean[1]
height_sex_mean[[1]]
남자
172.41
여자
166.642857142857
남자: 172.41
172.41
In [109]:
# 리스트 항목별 표준편차 sd
height_sex_sd <- sapply(height_sex, sd)
height_sex_sd
height_sex_sd[2]
height_sex_sd[[2]]
남자
6.80464710489987
여자
8.48741365058818
여자: 8.48741365058818
8.48741365058818
In [111]:
# 리스트 항목별 범위 구하기
height_sex_range <- sapply(height_sex, range)
height_sex_range
height_sex_range[1,]  # 행
height_sex_range[,1]  # 열
남자여자
162.2155.2
182.1176.9
남자
162.2
여자
155.2
  1. 162.2
  2. 182.1

명목형 변수 도수분포표 만들기

table() : 빈도수

In [113]:
# 혈액형별 빈도수 - table()
blood_type_table <- table(df$bloodtype)
blood_type_table
 A AB  B  O 
 4  3  5  5 

prop.table() : 상대도수

In [114]:
# 혈액형별 상대도수 - prop.table()
blood_type_prop_table <- prop.table(blood_type_table)
blood_type_prop_table
        A        AB         B         O 
0.2352941 0.1764706 0.2941176 0.2941176 

rbind() : 함께보기

In [115]:
blood_type_rbind <- rbind(blood_type_table, blood_type_prop_table)
blood_type_rbind
AABBO
blood_type_table4.00000003.00000005.00000005.0000000
blood_type_prop_table0.23529410.17647060.29411760.2941176

addmargins() : table 객체 합 구하기

In [155]:
# margin 값은 방향을 나타냄
# margin =1 ->가로방향 (행 방향) / margin= 2 -> 세로방향(칼럼 방향)
blood_type_rbind_sum <- addmargins(blood_type_rbind, margin = 2)
blood_type_rbind_sum
AABBOSum
blood_type_table4.00000003.00000005.00000005.000000017
blood_type_prop_table0.23529410.17647060.29411760.2941176 1

연속형 변수 도수분포표 만들기

  • 구간을 먼저 나눈다 : 계급

cut() : 구간 나누기

In [117]:
# 4개의 구간으로 나누기 - cut()
height_break_4 <- cut(df$height, breaks=4)
height_break_4
  1. (155,162]
  2. (162,169]
  3. (162,169]
  4. (155,162]
  5. (162,169]
  6. (175,182]
  7. (162,169]
  8. (162,169]
  9. (175,182]
  10. (162,169]
  11. (169,175]
  12. (169,175]
  13. (175,182]
  14. (175,182]
  15. (175,182]
  16. (175,182]
  17. (169,175]
Levels:
  1. '(155,162]'
  2. '(162,169]'
  3. '(169,175]'
  4. '(175,182]'
In [123]:
head(df$height) # 아래 키가 위에서 나눠진 구간 어디에 속하는지 보여주는 것
  1. 155.2
  2. 165.3
  3. 168.6
  4. 158.2
  5. 162.2
  6. 182.1
In [124]:
# 빈도수 - table()
height_break_4_table <- table(height_break_4)
height_break_4_table
height_break_4
(155,162] (162,169] (169,175] (175,182] 
        2         6         3         6 
In [125]:
# 상대도수 - prop.table
height_break_4_prop_table <- prop.table(height_break_4_table)
height_break_4_prop_table
height_break_4
(155,162] (162,169] (169,175] (175,182] 
0.1176471 0.3529412 0.1764706 0.3529412 
In [126]:
# 함께보기 -rbind()
height_break_4_rbind <- rbind(height_break_4_table, height_break_4_prop_table)
height_break_4_rbind
(155,162](162,169](169,175](175,182]
height_break_4_table2.00000006.00000003.00000006.0000000
height_break_4_prop_table0.11764710.35294120.17647060.3529412

cumsum() : 누적상대도수

In [127]:
height_break_4_cumsum <- rbind(height_break_4_rbind, cumsum(height_break_4_rbind[2,]))
height_break_4_cumsum
(155,162](162,169](169,175](175,182]
height_break_4_table2.00000006.00000003.00000006.0000000
height_break_4_prop_table0.11764710.35294120.17647060.3529412
0.11764710.47058820.64705881.0000000

rownames() : 열 이름 추가/변경

In [128]:
rownames(height_break_4_cumsum) <- c('도수','상대도수','누적도수')
height_break_4_cumsum
(155,162](162,169](169,175](175,182]
도수2.00000006.00000003.00000006.0000000
상대도수0.11764710.35294120.17647060.3529412
누적도수0.11764710.47058820.64705881.0000000

예제 studentlist2 도수분포표로 만들기

In [134]:
student_list2 <- read.csv('R-ggagi-data/example_studentlist2.csv')
#student_list2
In [133]:
# 도수 table()
student_list2_table <- table(student_list2$grade)
student_list2_table
 1  2  3  4 
16 37 31 16 
In [136]:
# 상대도수 prop.table
student_list2_porp_table <- prop.table(student_list2_table)
student_list2_porp_table
   1    2    3    4 
0.16 0.37 0.31 0.16 
In [137]:
# 함께보기 rbind
student_list2_rbind <- rbind(student_list2_table, student_list2_porp_table)
student_list2_rbind
1234
student_list2_table16.0037.0031.0016.00
student_list2_porp_table 0.16 0.37 0.31 0.16
In [138]:
# table 객체 합 구하기 addmargins
student_list2_rbind_sum <- addmargins(student_list2_rbind, margin = 2)
student_list2_rbind_sum
1234Sum
student_list2_table16.0037.0031.0016.00100
student_list2_porp_table 0.16 0.37 0.31 0.16 1
In [141]:
# 누적상대도수 cumsum
student_list2_cumsum <- rbind(student_list2_rbind, cumsum(student_list2_rbind[2,]))
student_list2_cumsum
1234
student_list2_table16.0037.0031.0016.00
student_list2_porp_table 0.16 0.37 0.31 0.16
0.16 0.53 0.84 1.00
In [144]:
# 열 이름 추가/변경 rownames
rownames(student_list2_cumsum) <- c('도수','상대도수','누적도수')
student_list2_cumsum
1234
도수16.0037.0031.0016.00
상대도수 0.16 0.37 0.31 0.16
누적도수 0.16 0.53 0.84 1.00

분할표 만들기 : 두 변수의 빈도수를 나타내는 표

In [147]:
df <- read.csv('R-ggagi-data/example_studentlist.csv')
#df
In [148]:
# 빈도수 구하기 table
sex_blood_table <- table(df$sex, df$bloodtype)
sex_blood_table
      
       A AB B O
  남자 2  2 4 2
  여자 2  1 1 3
In [149]:
# 도수 행, 열 합 구하기 addmargins
addmargins(sex_blood_table)
AABBOSum
남자2 2 4 2 10
여자2 1 1 3 7
Sum4 3 5 5 17
In [165]:
# margin =1 ->가로방향 (행 방향) / margin= 2 -> 세로방향(칼럼 방향)
addmargins(sex_blood_table, margin=2)
AABBOSum
남자2 2 4 2 10
여자2 1 1 3 7
In [167]:
# margin =1 ->가로방향 (행 방향) / margin= 2 -> 세로방향(칼럼 방향)
addmargins(sex_blood_table, margin=1)
AABBO
남자2242
여자2113
Sum4355
In [156]:
# 상대도수 구하기
sex_blood_prop_table <- prop.table(sex_blood_table)
sex_blood_prop_table
      
                A         AB          B          O
  남자 0.11764706 0.11764706 0.23529412 0.11764706
  여자 0.11764706 0.05882353 0.05882353 0.17647059
In [157]:
# 상대도수 합 구하기
addmargins(sex_blood_prop_table)
AABBOSum
남자0.1176471 0.117647060.235294120.1176471 0.5882353
여자0.1176471 0.058823530.058823530.1764706 0.4117647
Sum0.2352941 0.176470590.294117650.2941176 1.0000000
In [158]:
# 행별 상대도수 구하기
sex_blood_prop_table_margin_1 <- prop.table(sex_blood_table, margin=1)
sex_blood_prop_table_margin_1
      
               A        AB         B         O
  남자 0.2000000 0.2000000 0.4000000 0.2000000
  여자 0.2857143 0.1428571 0.1428571 0.4285714
In [159]:
# 열별 상대도수 구하기
sex_blood_prop_table_margin_2 <- prop.table(sex_blood_table, margin=2)
sex_blood_prop_table_margin_2
      
               A        AB         B         O
  남자 0.5000000 0.6666667 0.8000000 0.4000000
  여자 0.5000000 0.3333333 0.2000000 0.6000000

결측치 NA (값이 없는 경우) 처리

  • complete.cases() : NA값을 조사해 논리값으로 반환
  • na.omit() : 행에 NA가 있으면 행 삭제
In [160]:
a <- c(1,2,3,4,NA,6,7,8,9,10)
complete.cases(a)
  1. TRUE
  2. TRUE
  3. TRUE
  4. TRUE
  5. FALSE
  6. TRUE
  7. TRUE
  8. TRUE
  9. TRUE
  10. TRUE
In [163]:
# 빼 버려
a[complete.cases(a)]
  1. 1
  2. 2
  3. 3
  4. 4
  5. 6
  6. 7
  7. 8
  8. 9
  9. 10
In [164]:
na.omit(a)
  1. 1
  2. 2
  3. 3
  4. 4
  5. 6
  6. 7
  7. 8
  8. 9
  9. 10

댓글