[R 프로그래밍] 7. File I/O

Author : tmlab / Date : 2016. 10. 4. 00:57 / Category : Lecture/R 프로그래밍


PR 6

파일 입력과 출력

File I/O

1. Load Internal Dataset

1.1 data() or nothing

  • R에서는 수 많은 내장 데이터들이 존재합니다.
    • 또한, 패키지들을 설치하면 내장 명령어들을 연습해볼 수 있도록 별도의 dataset을 제공하기도 합니다
In [1]:
data()
  • 패키지를 설치하는 함수는 install_packages("이름")입니다
    • 해당 명령어 앞에 있는 주석처리(#)를 빼주시고 실행해보세요.
  • 패키지를 로딩하는 함수는 library(이름) 또는 require(이름)입니다.
In [2]:
#install.packages("MASS")
library(MASS)
In [3]:
data()
  • data(이름)으로 R Studio의 value 창에 띄울 수 있습니다
In [4]:
data(iris)
In [5]:
head(iris)
str(iris)
Out[5]:
Sepal.LengthSepal.WidthPetal.LengthPetal.WidthSpecies
15.13.51.40.2setosa
24.931.40.2setosa
34.73.21.30.2setosa
44.63.11.50.2setosa
553.61.40.2setosa
65.43.91.70.4setosa
'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 ...
  • data()의 사용없이 그냥 이름으로 불러와도 됩니다.
    • mtcars data
In [6]:
head(mtcars)
str(mtcars)
Out[6]:
mpgcyldisphpdratwtqsecvsamgearcarb
Mazda RX42161601103.92.6216.460144
Mazda RX4 Wag2161601103.92.87517.020144
Datsun 71022.84108933.852.3218.611141
Hornet 4 Drive21.462581103.083.21519.441031
Hornet Sportabout18.783601753.153.4417.020032
Valiant18.162251052.763.4620.221031
'data.frame': 32 obs. of  11 variables:
 $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
 $ disp: num  160 160 108 258 360 ...
 $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec: num  16.5 17 18.6 19.4 17 ...
 $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
 $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
 $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
 $ carb: num  4 4 1 1 2 1 4 2 2 4 ...
  • 다음은 1973년도 50개 주에서 수집된 범죄기록 데이터인 USArrests입니다.
    • Murder, Assault, Rape 는 십만명 당 체포비율입니다 (e.g., Murder가 13.2면 100,000명 중 13.2명이 살인죄로 체포)
    • UrbanPop은 도회지에서 살고 있는 인구 비율

USArrests를 사용하여 다음의 문제를 풀어보세요

In [7]:
head(USArrests)
str(USArrests)
Out[7]:
MurderAssaultUrbanPopRape
Alabama13.22365821.2
Alaska102634844.5
Arizona8.12948031
Arkansas8.81905019.5
California92769140.6
Colorado7.92047838.7
'data.frame':  50 obs. of  4 variables:
 $ Murder  : num  13.2 10 8.1 8.8 9 7.9 3.3 5.9 15.4 17.4 ...
 $ Assault : int  236 263 294 190 276 204 110 238 335 211 ...
 $ UrbanPop: int  58 48 80 50 91 78 77 72 80 60 ...
 $ Rape    : num  21.2 44.5 31 19.5 40.6 38.7 11.1 15.8 31.9 25.8 ...
  • 살인이 가장 많이 일어난 지역의 모든 정보를 추출해보세요
In [8]:
Out[8]:
MurderAssaultUrbanPopRape
Georgia17.42116025.8
  • 도시에서 살고 있는 인구가 가장 적은 지역의 모든 정보를 추출해보세요
In [9]:
Out[9]:
MurderAssaultUrbanPopRape
Vermont2.2483211.2

2. File Input

2.1 load()

  • .RData 형식의 파일을 불러오는 함수
  • 사용방법은 load("파일이름")
    • 사용 후, data(data이름)처럼 변수가 자동으로 불러와집니다.
In [ ]:
load("c:/Users//jester/Dropbox/R-프로그래밍/실습예제/3주차/ex2.RData")
  • 읽어들인 ex2.RData 파일은 x,y 그리고 movie Data가 들어있습니다
  • 별도의 할당 없이 사용 가능합니다
In [140]:
x
y
head(movie)
class(movie)
15913
261014
371115
481216
161284
151173
141062
13951
Dr.WhoDr.WhoGothamCSI:MiamiDare DevilGothamGame of ThrownCSI:MiamiDare DevilDr.Who<8b>GothamDare DevilDare DevilGame of ThrownDr.WhoGame of ThrownGothamGothamCSI:MiamiDr.Who
Dr.WhoGothamGame of ThrownDr.WhoGame of ThrownGothamGothamCSI:MiamiDr.WhoGotham<8b>GothamGothamCSI:MiamiGothamDare DevilDare DevilDr.WhoGothamGothamGame of Thrown
GothamGothamGame of ThrownCSI:MiamiDare DevilDare DevilCSI:MiamiGothamDare DevilCSI:Miami<8b>Dare DevilDare DevilDare DevilGame of ThrownDr.WhoGothamGame of ThrownGame of ThrownDr.WhoDare Devil
GothamGame of ThrownGame of ThrownDare DevilDare DevilGame of ThrownCSI:MiamiDr.WhoDare DevilGotham<8b>GothamGothamDr.WhoCSI:MiamiCSI:MiamiCSI:MiamiDr.WhoDr.WhoCSI:MiamiDare Devil
CSI:MiamiDare DevilGame of ThrownDare DevilGame of ThrownGothamDr.WhoCSI:MiamiCSI:MiamiGame of Thrown<8b>GothamGothamCSI:MiamiDr.WhoDare DevilCSI:MiamiCSI:MiamiCSI:MiamiGame of ThrownDr.Who
GothamGothamCSI:MiamiDr.WhoGame of ThrownGothamGame of ThrownGame of ThrownGame of ThrownGotham<8b>Game of ThrownCSI:MiamiGothamGame of ThrownDr.WhoGame of ThrownGame of ThrownDare DevilGothamGotham
"matrix"

2.2 scan()

  • vector로 받습니다
In [141]:
demo <- scan("c:/Users/atara/Dropbox/R-프로그래밍/실습예제/demo.csv",what="")
In [142]:
demo;str(demo)
  1. "Black"
  2.  
  3. "Panther,Daredevil,Hawkeye,Loki,Punisher,Storm"
  4.  
  5. "Black"
  6.  
  7. "Widow,Deadpool,Hulk,Luke"
  8.  
  9. "Cage,Rocket"
  10.  
  11. "Raccoon,Taskmaster"
  12. "Cable,Doctor"
  13.  
  14. "Strange,Human"
  15.  
  16. "Torch,Moon"
  17.  
  18. "Knight,Scarlet"
  19.  
  20. "Witch,Thing"
  21.  
  22. "Captain"
  23.  
  24. "America,Emma"
  25.  
  26. "Frost,Invisible"
  27. "Woman,Ms."
  28.  
  29. "Marvel,Silver"
  30.  
  31. "Surfer,Thor"
  32.  
  33. "Colossus,Gambit,Iron"
  34.  
  35. "Man,Nightcrawler,Spider-Man,Wolverine"
  36.  
  37. "Cyclops,Ghost"
  38. "Rider,Jean"
  39.  
  40. "Grey,Psylocke,Squirrel"
  41.  
  42. "Girl,Barricade"
 chr [1:23] "Black" "Panther,Daredevil,Hawkeye,Loki,Punisher,Storm" ...

2.3 read.table()

  • Data Frame으로 받습니다
In [143]:
demo1<- read.table("c:/Users/atara/Dropbox/R-프로그래밍/실습예제/demo.csv",header=F,sep=",",stringsAsFactors=F)
In [144]:
demo1
V1V2V3V4V5V6
1Black PantherDaredevilHawkeyeLokiPunisherStorm
2Black WidowDeadpoolHulkLuke CageRocket RaccoonTaskmaster
3CableDoctor StrangeHuman TorchMoon KnightScarlet WitchThing
4Captain AmericaEmma FrostInvisible WomanMs. MarvelSilver SurferThor
5ColossusGambitIron ManNightcrawlerSpider-ManWolverine
6CyclopsGhost RiderJean GreyPsylockeSquirrel GirlBarricade

2.4 read.csv()

  • Data Frame으로 받습니다
In [145]:
demo2<-read.csv("c:/Users/atara/Dropbox/R-프로그래밍/실습예제/demo.csv",header=F,stringsAsFactors=F)
In [146]:
demo2
V1V2V3V4V5V6
1Black PantherDaredevilHawkeyeLokiPunisherStorm
2Black WidowDeadpoolHulkLuke CageRocket RaccoonTaskmaster
3CableDoctor StrangeHuman TorchMoon KnightScarlet WitchThing
4Captain AmericaEmma FrostInvisible WomanMs. MarvelSilver SurferThor
5ColossusGambitIron ManNightcrawlerSpider-ManWolverine
6CyclopsGhost RiderJean GreyPsylockeSquirrel GirlBarricade
  • read.csv()의 인수에 대해서 한번 알아보겠습니다
    • read.table에서도 동일하게 적용됩니다.
    • header 는 첫 행(row)를 열 이름으로 받을건지를 물어보는 인수입니다.
      • 열 이름이 있다면, header를 T로 주셔야 합니다. default값은 T입니다
    • sep은 열 구분자를 지정해주는 인수입니다.
      • read.csv는 default값이 ","(comma)입니다
    • colClasses는 각 열의 data type을 미리 정의해줄 수 있는 인수입니다
    • comment.char는 주석처리할 기호를 정의한 인수입니다
      • comment.char = "#"로 하시면, #ddd 등 제일 앞의 기호가 #인 문장의 경우 주석으로 처리하여 불러오지 않습니다.
    • na.strings는 NA값으로 처리할 문자열들을 미리 정의하는 것입니다.
      • 일상데이터의 경우, 모든 칸이 전부 차 있거나 NA로 통일되어 표기하는 일은 드뭅니다
      • 위와 같은 경우, 데이터를 불러올 때 해당 문장을 미리 NA값으로 받겠다고 표기하는 인수가 na.strings 입니다.
    • fileEncoding은 불러들인 문자열을 원하는 형식으로 재 인코딩 해주는 인수입니다
      • 하단에 나오는 iconv에서 to= 인수와 같은 역할을 합니다.
      • 인코딩의 형식은 UTF-8, EUC-KR, Latin-1, CP949 등등이 있습니다.
    • encoding은 불러들일 file의 인코딩을 미리 선언해주는 인수입니다
      • iconv에서 from= 인수와 같은 역할을 합니다
    • row.names은 불러들일 file의 선택한 위치의 열을 행 이름으로 하겠다는 것입니다
      • row.names=1 이면 첫번째 열을, row.names=2면 두번째 열을 행 이름으로 합니다.
In [147]:
#아무 인수도 없을 때
demo2<-read.csv("c:/Users/atara/Dropbox/R-프로그래밍/실습예제/demo.na_2.csv")
demo2
X..연습.테이블.입니다.XX.1X.2X.3X.4
11DaredevilHawkeyeLokiPunisherStorm
22DeadpoolHulkLuke CageRocket RaccoonTaskmaster
33Doctor StrangeHuman Torch.Scarlet WitchThing
46Invisible WomanMs. MarvelSilver SurferThor
55Iron ManNightcrawlerN.A.Wolverine
67Ghost RiderJean GreyPsylockeSquirrel GirlBarricade
In [148]:
#header와 stringsAsFactors 추가
demo2<-read.csv("c:/Users/atara/Dropbox/R-프로그래밍/실습예제/demo.na_2.csv",header=F,stringsAsFactors=F)
demo2
V1V2V3V4V5V6
1# 연습 테이블 입니다.
21DaredevilHawkeyeLokiPunisherStorm
32DeadpoolHulkLuke CageRocket RaccoonTaskmaster
43Doctor StrangeHuman Torch.Scarlet WitchThing
56Invisible WomanMs. MarvelSilver SurferThor
65Iron ManNightcrawlerN.A.Wolverine
77Ghost RiderJean GreyPsylockeSquirrel GirlBarricade
In [56]:
#comment.char="#" 추가
demo2<-read.csv("c:/Users/atara/Dropbox/R-프로그래밍/실습예제/demo.na_2.csv",header=F,stringsAsFactors=F,comment.char="#")
demo2
str(demo2)
V1V2V3V4V5V6
11DaredevilHawkeyeLokiPunisherStorm
22DeadpoolHulkLuke CageRocket RaccoonTaskmaster
33Doctor StrangeHuman Torch.Scarlet WitchThing
46Invisible WomanMs. MarvelSilver SurferThor
55Iron ManNightcrawlerN.A.Wolverine
67Ghost RiderJean GreyPsylockeSquirrel GirlBarricade
'data.frame': 6 obs. of  6 variables:
 $ V1: int  1 2 3 6 5 7
 $ V2: chr  "Daredevil" "Deadpool" "Doctor Strange" "" ...
 $ V3: chr  "Hawkeye" "Hulk" "Human Torch" "Invisible Woman" ...
 $ V4: chr  "Loki" "Luke Cage" "." "Ms. Marvel" ...
 $ V5: chr  "Punisher" "Rocket Raccoon" "Scarlet Witch" "Silver Surfer" ...
 $ V6: chr  "Storm" "Taskmaster" "Thing" "Thor" ...
In [105]:
#na.strings 추가
demo2<-read.csv("c:/Users/atara/Dropbox/R-프로그래밍/실습예제/demo.na_2.csv",header=F,stringsAsFactors=F,
               comment.char="#",na.strings=c(".","N.A.",""))
demo2
str(demo2)
V1V2V3V4V5V6
11DaredevilHawkeyeLokiPunisherStorm
22DeadpoolHulkLuke CageRocket RaccoonTaskmaster
33Doctor StrangeHuman TorchNAScarlet WitchThing
46NAInvisible WomanMs. MarvelSilver SurferThor
55NAIron ManNightcrawlerNAWolverine
67Ghost RiderJean GreyPsylockeSquirrel GirlBarricade
'data.frame':  6 obs. of  6 variables:
 $ V1: int  1 2 3 6 5 7
 $ V2: chr  "Daredevil" "Deadpool" "Doctor Strange" NA ...
 $ V3: chr  "Hawkeye" "Hulk" "Human Torch" "Invisible Woman" ...
 $ V4: chr  "Loki" "Luke Cage" NA "Ms. Marvel" ...
 $ V5: chr  "Punisher" "Rocket Raccoon" "Scarlet Witch" "Silver Surfer" ...
 $ V6: chr  "Storm" "Taskmaster" "Thing" "Thor" ...
  • colClasses로 모든 열을 character값으로 받겠습니다
In [107]:
#na.strings 추가
demo2<-read.csv("c:/Users/atara/Dropbox/R-프로그래밍/실습예제/demo.na_2.csv",header=F,stringsAsFactors=F,
               comment.char="#",na.strings=c(".","N.A.",""),colClasses=rep("character",6))
demo2
str(demo2)
V1V2V3V4V5V6
11DaredevilHawkeyeLokiPunisherStorm
22DeadpoolHulkLuke CageRocket RaccoonTaskmaster
33Doctor StrangeHuman TorchNAScarlet WitchThing
46NAInvisible WomanMs. MarvelSilver SurferThor
55NAIron ManNightcrawlerNAWolverine
67Ghost RiderJean GreyPsylockeSquirrel GirlBarricade
'data.frame':  6 obs. of  6 variables:
 $ V1: chr  "1" "2" "3" "6" ...
 $ V2: chr  "Daredevil" "Deadpool" "Doctor Strange" NA ...
 $ V3: chr  "Hawkeye" "Hulk" "Human Torch" "Invisible Woman" ...
 $ V4: chr  "Loki" "Luke Cage" NA "Ms. Marvel" ...
 $ V5: chr  "Punisher" "Rocket Raccoon" "Scarlet Witch" "Silver Surfer" ...
 $ V6: chr  "Storm" "Taskmaster" "Thing" "Thor" ...
In [59]:
# 인코딩 문제, 받는 파일의 인코딩형식이 utf-8의 경우
# 한글 windows를 쓴다면 기본 인코딩 형식이 EUC-KR입니다
demo3<-read.csv("c:/Users/atara/Dropbox/R-프로그래밍/실습예제/demo.na_3.csv")
demo3
Error in make.names(col.names, unique = TRUE): 유효하지 않은 멀티바이트 문자열 1입니다
Traceback:

1. read.csv("c:/Users/atara/Dropbox/R-프로그래밍/실습예제/demo.na_3.csv")
2. read.table(file = file, header = header, sep = sep, quote = quote, 
 .     dec = dec, fill = fill, comment.char = comment.char, ...)
3. make.names(col.names, unique = TRUE)
In [64]:
# fileencoding 설정
demo3<-read.csv("c:/Users/atara/Dropbox/R-프로그래밍/실습예제/demo.na_3.csv",fileEncoding="UTF-8")
demo3
Warning message:
In read.table(file = file, header = header, sep = sep, quote = quote, : 입력 커넥션 'c:/Users/atara/Dropbox/R-<ed>봽濡쒓렇<eb>옒諛<8d>/<ec>떎<ec>뒿<ec>삁<ec>젣/demo.na_3.csv'에서 유효하지 않은 입력을 찾았습니다Warning message:
In read.table(file = file, header = header, sep = sep, quote = quote, : 'c:/Users/atara/Dropbox/R-<ed>봽濡쒓렇<eb>옒諛<8d>/<ec>떎<ec>뒿<ec>삁<ec>젣/demo.na_3.csv'에서 readTableHeader에 의하여 발견된 완성되지 않은 마지막 라인입니다
X.
In [66]:
# 인코딩 지정
demo3<-read.csv("c:/Users/atara/Dropbox/R-프로그래밍/실습예제/demo.na_3.csv",encoding="UTF-8")
demo3
X.U.FEFF...연습.테이블.입니다.XX.1X.2X.3X.4
11DaredevilHawkeyeLokiPunisherStorm
22DeadpoolHulkLuke CageRocket RaccoonTaskmaster
33Doctor StrangeHuman Torch.Scarlet WitchThing
46Invisible WomanMs. MarvelSilver SurferThor
55Iron ManNightcrawlerN.A.Wolverine
67Ghost RiderJean GreyPsylockeSquirrel GirlBarricade
In [77]:
# colClasses를 제외한 모든 인수를 적용
demo3<-read.csv("c:/Users/atara/Dropbox/R-프로그래밍/실습예제/demo.na_3.csv",header=F,stringsAsFactors=F,
               comment.char="#",na.strings=c(".","N.A.",""),encoding="UTF-8")
demo3
V1V2V3V4V5V6
1#연습 테이블 입니다.NANANANANA
21DaredevilHawkeyeLokiPunisherStorm
32DeadpoolHulkLuke CageRocket RaccoonTaskmaster
43Doctor StrangeHuman TorchNAScarlet WitchThing
56NAInvisible WomanMs. MarvelSilver SurferThor
65NAIron ManNightcrawlerNAWolverine
77Ghost RiderJean GreyPsylockeSquirrel GirlBarricade
  • comment.char가 인코딩 문제로 인해 문제가 생긴걸 확인할 수 있습니다.
    • 이는 인코딩 변환시에 서로 다른 형식으로 인해 다른 무엇인가가 들어와서 그렇습니다.
    • R에서 출력해보면 다음과 같은 값이 #앞에 붙는것을 확인 할 수 있습니다.reason
In [101]:
# colClasses를 제외한 모든 인수를 적용
demo3<-read.csv("c:/Users/atara/Dropbox/R-프로그래밍/실습예제/demo.na_3.csv",header=F,stringsAsFactors=F,
               comment.char="<",na.strings=c(".","N.A.",""),encoding="UTF-8",allowEscapes=T)
demo3
str(demo3)
V1V2V3V4V5V6
1#연습 테이블 입니다.NANANANANA
21DaredevilHawkeyeLokiPunisherStorm
32DeadpoolHulkLuke CageRocket RaccoonTaskmaster
43Doctor StrangeHuman TorchNAScarlet WitchThing
56NAInvisible WomanMs. MarvelSilver SurferThor
65NAIron ManNightcrawlerNAWolverine
77Ghost RiderJean GreyPsylockeSquirrel GirlBarricade
'data.frame':  7 obs. of  6 variables:
 $ V1: chr  "<U+FEFF>#연습 테이블 입니다.""| __truncated__ "1" "2" "3" ...
 $ V2: chr  NA "Daredevil" "Deadpool" "Doctor Strange" ...
 $ V3: chr  NA "Hawkeye" "Hulk" "Human Torch" ...
 $ V4: chr  NA "Loki" "Luke Cage" NA ...
 $ V5: chr  NA "Punisher" "Rocket Raccoon" "Scarlet Witch" ...
 $ V6: chr  NA "Storm" "Taskmaster" "Thing" ...
  • 주석으로 처리가 안되네요
    • 방법은 있겠지만 제 능력의 한계입니다
In [104]:
# 첫 행을 제외하고 받습니다
demo3<-read.csv("c:/Users/atara/Dropbox/R-프로그래밍/실습예제/demo.na_3.csv",header=F,stringsAsFactors=F,
               comment.char="<",na.strings=c(".","N.A.",""),encoding="UTF-8")[-1,]
demo3
str(demo3)
V1V2V3V4V5V6
21DaredevilHawkeyeLokiPunisherStorm
32DeadpoolHulkLuke CageRocket RaccoonTaskmaster
43Doctor StrangeHuman TorchNAScarlet WitchThing
56NAInvisible WomanMs. MarvelSilver SurferThor
65NAIron ManNightcrawlerNAWolverine
77Ghost RiderJean GreyPsylockeSquirrel GirlBarricade
'data.frame':  6 obs. of  6 variables:
 $ V1: chr  "1" "2" "3" "6" ...
 $ V2: chr  "Daredevil" "Deadpool" "Doctor Strange" NA ...
 $ V3: chr  "Hawkeye" "Hulk" "Human Torch" "Invisible Woman" ...
 $ V4: chr  "Loki" "Luke Cage" NA "Ms. Marvel" ...
 $ V5: chr  "Punisher" "Rocket Raccoon" "Scarlet Witch" "Silver Surfer" ...
 $ V6: chr  "Storm" "Taskmaster" "Thing" "Thor" ...
  • 이제 첫 열만 numeric으로 바꾸도록 합니다
In [111]:
demo3$V1<-as.integer(demo3$V1)
demo3
str(demo3)
V1V2V3V4V5V6
21DaredevilHawkeyeLokiPunisherStorm
32DeadpoolHulkLuke CageRocket RaccoonTaskmaster
43Doctor StrangeHuman TorchNAScarlet WitchThing
56NAInvisible WomanMs. MarvelSilver SurferThor
65NAIron ManNightcrawlerNAWolverine
77Ghost RiderJean GreyPsylockeSquirrel GirlBarricade
'data.frame':  6 obs. of  6 variables:
 $ V1: int  1 2 3 6 5 7
 $ V2: chr  "Daredevil" "Deadpool" "Doctor Strange" NA ...
 $ V3: chr  "Hawkeye" "Hulk" "Human Torch" "Invisible Woman" ...
 $ V4: chr  "Loki" "Luke Cage" NA "Ms. Marvel" ...
 $ V5: chr  "Punisher" "Rocket Raccoon" "Scarlet Witch" "Silver Surfer" ...
 $ V6: chr  "Storm" "Taskmaster" "Thing" "Thor" ...

2.5 명령어의 차이

In [39]:
str(demo)
 chr [1:23] "Black" "Panther,Daredevil,Hawkeye,Loki,Punisher,Storm" ...
In [107]:
str(demo1)
'data.frame':  6 obs. of  6 variables:
 $ V1: chr  "Black Panther" "Black Widow" "Cable" "Captain America" ...
 $ V2: chr  "Daredevil" "Deadpool" "Doctor Strange" "Emma Frost" ...
 $ V3: chr  "Hawkeye" "Hulk" "Human Torch" "Invisible Woman" ...
 $ V4: chr  "Loki" "Luke Cage" "Moon Knight" "Ms. Marvel" ...
 $ V5: chr  "Punisher" "Rocket Raccoon" "Scarlet Witch" "Silver Surfer" ...
 $ V6: chr  "Storm" "Taskmaster" "Thing" "Thor" ...
In [106]:
str(demo2)
'data.frame':  6 obs. of  6 variables:
 $ V1: chr  "Black Panther" "Black Widow" "Cable" "Captain America" ...
 $ V2: chr  "Daredevil" "Deadpool" "Doctor Strange" "Emma Frost" ...
 $ V3: chr  "Hawkeye" "Hulk" "Human Torch" "Invisible Woman" ...
 $ V4: chr  "Loki" "Luke Cage" "Moon Knight" "Ms. Marvel" ...
 $ V5: chr  "Punisher" "Rocket Raccoon" "Scarlet Witch" "Silver Surfer" ...
 $ V6: chr  "Storm" "Taskmaster" "Thing" "Thor" ...

2.5.1 read.csv와 read.table의 차이

  • 사실 둘은 동일한 함수입니다
    • 단지 .csv파일은 각 열마다 구분을 ","(comma)로 구분하는데, 매번 read.table()로 할때마다 sep=","을 주기 귀찮고, .csv파일이 많기 때문에 별도로 준것일 뿐입니다.
    • 동일한 이유로 read.delim()이라는 함수가 존재하는데, 이것은 "\t"(tab)키로 열을 구분하는 .tsv파일을 읽기 위함입니다.
      + '함수명()'에서 뒤에 가로만 빼고 '함수명'만 적으시면 해당 파일을 .R형태로 제공하는 경우에 함수 내용을 볼 수 있습니다. 하단에 read.csv와 read.delim 함수를 보여드리겠습니다.
    • 따라서 read.table이 상위 함수이고, 많이 사용하는 .csv나 .tsv 파일을 읽기 위해 read.csv와 read.delim함수를 따로 만들어 놓은것이라고 생각하면 됩니다.
    • 뭐... 귀찮으면 sep=""으로 구분하시면 되겠습니다.
In [1]:
read.csv
function (file, header = TRUE, sep = ",", quote = "\"", dec = ".", 
    fill = TRUE, comment.char = "", ...) 
read.table(file = file, header = header, sep = sep, quote = quote, 
    dec = dec, fill = fill, comment.char = comment.char, ...)
In [2]:
read.delim
function (file, header = TRUE, sep = "\t", quote = "\"", dec = ".", 
    fill = TRUE, comment.char = "", ...) 
read.table(file = file, header = header, sep = sep, quote = quote, 
    dec = dec, fill = fill, comment.char = comment.char, ...)

2.6 웹에 있는 표를 읽어 올 수 있는 readHTMLTable()

  • 해당 함수는 XML이라는 패키지에 있습니다
  • readHTMLTable("홈페이지 주소")로 사용하시면 해당 페이지의 표에 들어 있는 정보를 저장 가능 합니다.
  • 일종의 웹 크롤링입니다.
  • 웹 페이지에 있는 모든 표를 Data frame으로 가져오고, 각각의 표를 List에 담아 제공합니다

    • 따라서 첫번째에 있는 표를 출력하고 싶으시다면 [[1]]을 붙여주시면 됩니다
  • 이제 "http://www.worldometers.info/world-population/" 에서 표를 가져와보겠습니다

In [1]:
#install.packages("XML")
library(XML)
world_pop <- readHTMLTable("http://www.worldometers.info/world-population/")
In [2]:
str(world_pop)
List of 5
 $ NULL        :'data.frame': 14 obs. of  9 variables:
  ..$ Year            : Factor w/ 14 levels "1955","1960",..: 14 13 12 11 10 9 8 7 6 5 ...
  ..$ Population      : Factor w/ 14 levels "2,758,314,525",..: 14 13 12 11 10 9 8 7 6 5 ...
  ..$ Yearly %  Change: Factor w/ 13 levels "1.13 %","1.18 %",..: 1 2 3 4 5 6 10 8 9 12 ...
  ..$ Yearly Change   : Factor w/ 14 levels "46,633,043","52,005,861",..: 11 12 9 8 7 13 14 10 5 6 ...
  ..$ Median Age      : Factor w/ 9 levels "22","23","24",..: 8 9 7 6 5 4 3 2 2 1 ...
  ..$ Fertility Rate  : Factor w/ 13 levels "2.5","2.51","2.56",..: 1 2 3 4 5 6 7 8 9 10 ...
  ..$ Density (P/Km²) : Factor w/ 12 levels "21","23","28",..: 12 12 11 10 9 8 7 6 5 4 ...
  ..$ Urban Pop %     : Factor w/ 13 levels "33.8 %","36.7 %",..: 12 11 10 9 8 7 6 5 4 3 ...
  ..$ Urban Population: Factor w/ 13 levels "1,019,494,911",..: 12 11 10 9 8 7 6 5 4 3 ...
 $ NULL        :'data.frame': 7 obs. of  9 variables:
  ..$ Year            : Factor w/ 7 levels "2020","2025",..: 1 2 3 4 5 6 7
  ..$ Population      : Factor w/ 7 levels "7,758,156,792",..: 1 2 3 4 5 6 7
  ..$ Yearly %  Change: Factor w/ 7 levels "0.57 %","0.64 %",..: 7 6 5 4 3 2 1
  ..$ Yearly Change   : Factor w/ 7 levels "54,251,243","59,331,561",..: 7 6 5 4 3 2 1
  ..$ Median  Age     : Factor w/ 6 levels "31","32","33",..: 1 2 3 4 5 5 6
  ..$ Fertility  Rate : Factor w/ 7 levels "2.25","2.28",..: 7 6 5 4 3 2 1
  ..$ Density  (P/Km²): Factor w/ 7 levels "60","63","65",..: 1 2 3 4 5 6 7
  ..$ Urban Pop %     : Factor w/ 7 levels "55.9 %","57.8 %",..: 1 2 3 4 5 6 7
  ..$ Urban Population: Factor w/ 7 levels "4,338,014,924",..: 1 2 3 4 5 6 7
 $ NULL        :'data.frame': 1 obs. of  24 variables:
  ..$ Year: Factor w/ 1 level "Population": 1
  ..$ 1   : Factor w/ 1 level "0.2": 1
  ..$ 1000: Factor w/ 1 level "0.275": 1
  ..$ 1500: Factor w/ 1 level "0.45": 1
  ..$ 1650: Factor w/ 1 level "0.5": 1
  ..$ 1750: Factor w/ 1 level "0.7": 1
  ..$ 1804: Factor w/ 1 level "1": 1
  ..$ 1850: Factor w/ 1 level "1.2": 1
  ..$ 1900: Factor w/ 1 level "1.6": 1
  ..$ 1927: Factor w/ 1 level "2": 1
  ..$ 1950: Factor w/ 1 level "2.55": 1
  ..$ 1960: Factor w/ 1 level "3": 1
  ..$ 1974: Factor w/ 1 level "4": 1
  ..$ 1980: Factor w/ 1 level "4.5": 1
  ..$ 1987: Factor w/ 1 level "5": 1
  ..$ 1999: Factor w/ 1 level "6": 1
  ..$ 2011: Factor w/ 1 level "7": 1
  ..$ 2020: Factor w/ 1 level "7.7": 1
  ..$ 2024: Factor w/ 1 level "8": 1
  ..$ 2030: Factor w/ 1 level "8.4": 1
  ..$ 2038: Factor w/ 1 level "9": 1
  ..$ 2050: Factor w/ 1 level "9.5": 1
  ..$ 2056: Factor w/ 1 level "10": 1
  ..$ 2100: Factor w/ 1 level "11.2": 1
 $ NULL        :'data.frame': 6 obs. of  12 variables:
  ..$ #               : Factor w/ 6 levels "1","2","3","4",..: 1 2 3 4 5 6
  ..$ Region          : Factor w/ 6 levels "Africa","Asia",..: 2 1 3 4 5 6
  ..$ Population(2016): Factor w/ 6 levels "1,216,129,815",..: 4 1 6 5 2 3
  ..$ YearlyChange    : Factor w/ 6 levels "0.06 %","0.75 %",..: 3 6 1 4 2 5
  ..$ NetChange       : Factor w/ 6 levels "2,691,288","29,951,533",..: 4 2 3 6 1 5
  ..$ Density(P/Km²)  : Factor w/ 6 levels "143","19","32",..: 1 5 4 3 2 6
  ..$ Area(Km²)       : Factor w/ 6 levels "18,680,276","20,158,154",..: 5 4 3 2 1 6
  ..$ Migrants(net)   : Factor w/ 6 levels "-1,256,133","-414,767",..: 1 3 6 2 4 5
  ..$ Fert.Rate       : Factor w/ 6 levels "1.6","1.86","2.15",..: 4 6 1 3 2 5
  ..$ Med.Age         : Factor w/ 6 levels "19","29","30",..: 3 1 6 2 5 4
  ..$ UrbanPop %      : Factor w/ 6 levels "40.2 %","48.7 %",..: 2 1 4 5 6 3
  ..$ WorldShare      : Factor w/ 6 levels "0.5 %","16.4 %",..: 4 2 6 5 3 1
 $ popbycountry:'data.frame': 233 obs. of  12 variables:
  ..$ #                      : Factor w/ 233 levels "1","10","100",..: 1 112 157 168 179 190 201 212 223 2 ...
  ..$ Country (or dependency): Factor w/ 233 levels "Afghanistan",..: 44 96 219 97 28 157 151 17 170 133 ...
  ..$ Population(2016)       : Factor w/ 233 levels "1,176,598","1,211,245",..: 9 7 120 94 83 66 64 54 45 41 ...
  ..$ YearlyChange           : Factor w/ 178 levels "-0.01 %","-0.02 %",..: 50 93 66 90 72 133 155 92 1 98 ...
  ..$ NetChange              : Factor w/ 233 levels "-1,308","-138,590",..: 184 71 90 116 37 122 143 40 6 35 ...
  ..$ Density(P/Km²)         : Factor w/ 164 levels "0","1,163","1,233",..: 35 109 94 34 68 70 54 4 157 134 ...
  ..$ Area(Km²)              : Factor w/ 225 levels "0","1","1,041,616",..: 214 75 212 20 199 197 218 42 51 22 ...
  ..$ Migrants(net)          : Factor w/ 166 levels "","-1,000","-1,120",..: 62 79 101 23 133 41 84 70 125 15 ...
  ..$ Fert.Rate              : Factor w/ 153 levels "1.07","1.19",..: 23 77 43 78 41 107 143 64 31 67 ...
  ..$ Med.Age                : Factor w/ 33 levels "15","16","17",..: 23 13 24 14 17 9 4 12 25 13 ...
  ..$ UrbanPop %             : Factor w/ 198 levels "0 %","11.9 %",..: 89 36 158 84 161 50 71 43 128 142 ...
  ..$ WorldShare             : Factor w/ 23 levels "0 %","0.1 %",..: 17 16 23 22 21 20 19 18 15 14 ...
In [21]:
head(world_pop[[1]])
YearPopulationYearly % ChangeYearly ChangeMedian AgeFertility RateDensity (P/Km짼)Urban Pop %Urban Population
120167,432,663,2751.13 %83,191,17629.92.55754.3 %4,034,193,153
220157,349,472,0991.18 %83,949,411302.515753.8 %3,957,285,013
320106,929,725,0431.23 %82,017,839292.565351.5 %3,571,272,167
420056,519,635,8501.25 %78,602,746272.625049.1 %3,199,013,076
520006,126,622,1211.33 %78,299,807262.744746.6 %2,856,131,072
619955,735,123,0841.55 %85,091,077253.044444.8 %2,568,062,984
  • Density 열 이름을 보시면 (P/KM짼)이라는 의미를 알수 없는 글자가 있습니다
    • Encoding이 깨진 문자열인데, iconv()라는 함수를 사용하여 인코딩 방식을 바꿔주면 됩니다
    • 흔히 웹상에서 주로 쓰는 인코딩 방식은 "UTF-8"이라는 문자열이며, 한글에서 이 상태로도 깨질 시 "CP949"나 "euc-kr"방식을 쓰면 됩니다. CP949나 euc-kr은 한글 인코딩 형식입니다.
    • 사용 방법은 iconv(data,from="",to="")입니다
    • 앞으로 이 인코딩문제는 여러분들을 계속 괴롭힐겁니다 :)
In [25]:
colnames(world_pop[[1]])<-iconv(colnames(world_pop[[1]]),from="UTF-8",to="UTF-8")
head(world_pop[[1]])
YearPopulationYearly % ChangeYearly ChangeMedian AgeFertility RateDensity (P/Km²)Urban Pop %Urban Population
120167,432,663,2751.13 %83,191,17629.92.55754.3 %4,034,193,153
220157,349,472,0991.18 %83,949,411302.515753.8 %3,957,285,013
320106,929,725,0431.23 %82,017,839292.565351.5 %3,571,272,167
420056,519,635,8501.25 %78,602,746272.625049.1 %3,199,013,076
520006,126,622,1211.33 %78,299,807262.744746.6 %2,856,131,072
619955,735,123,0841.55 %85,091,077253.044444.8 %2,568,062,984

PR6.csv file을 읽어보세요

In [7]:
pr6<-read.csv("PR6.csv",header=T,stringsAsFactors=F,fileEncoding="euc-kr")
In [8]:
pr6
Out[8]:
순번이름학년언어
11최재현2학년Java
22김연수2학년Python
33조준희2학년Java
44남성현2학년Java
55임동희2학년Java
66전효진1학년Python
77김예솔3학년Python
88박종혁1학년
99박은비1학년Python
1010정현재3학년Python
1111주소영1학년Python
1212문여은1학년
1313장영빈1학년
1414김다인1학년
1515이연주1학년Python
1616황수진2학년Python
1717신유빈1학년Java
1818윤홍찬3학년Python
1919안상호1학년Python
2020최재승1학년
2121신건1학년
2222김지현1학년Java
2323황상민1학년Python
2424곽헌규3학년Python
2525안종배3학년Java
2626김소정1학년Java
2727김나현1학년Java
2828박태현1학년Java
2929정용주4학년C
3030윤재건1학년Java
3131신현재4학년Java
3232정다희3학년Python
3333박우정1학년Python
3434채정우1학년Java
3535이주연1학년Python
3636한승현1학년Python
In [9]:
str(pr6)
'data.frame':  36 obs. of  4 variables:
 $ 순번: int  1 2 3 4 5 6 7 8 9 10 ...
 $ 이름: chr  "최재현" "김연수" "조준희" "남성현" ...
 $ 학년: chr  "2학년" "2학년" "2학년" "2학년" ...
 $ 언어: chr  "Java" "Python" "Java" "Java" ...
  • 가장 많이 선택한 언어는 python인걸로 확인되었습니다.
In [10]:
sort(table(pr6$언어),decreasing=T)[1]
Out[10]:
Python: 16
  • 아직 언어를 선택하지 않은 학생들만 뽑아서 later 변수에 삽입하세요
In [12]:
Out[12]:
순번이름학년언어
88박종혁1학년
1212문여은1학년
1313장영빈1학년
1414김다인1학년
2020최재승1학년
2121신건1학년
  • Java를 선택한 학생들만 뽑아서 java 변수에 삽입하세요
In [14]:
Out[14]:
순번이름학년언어
11최재현2학년Java
33조준희2학년Java
44남성현2학년Java
55임동희2학년Java
1717신유빈1학년Java
2222김지현1학년Java
2525안종배3학년Java
2626김소정1학년Java
2727김나현1학년Java
2828박태현1학년Java
3030윤재건1학년Java
3131신현재4학년Java
3434채정우1학년Java
  • Java를 선택한 학생들의 학년 별 분포는?
In [15]:
Out[15]:
1학년 2학년 3학년 4학년 
    7     4     1     1 

3. File output

3.1 Save()

  • .RData 형식의 file을 만들어주는 함수
    • 여러 변수들은 하나의 file에 넣어서 저장 가능합니다.
    • load()로 읽고, 여러 변수를 한번에 받을 수 있습니다.
In [217]:
save(java,later,file="students.RData")

3.2 write.table()

In [172]:
write.table(later,"I_kill_you.csv",row.names=F)
  • 생성한 파일은 getwd()를 사용하면 출력되는 위치에 있습니다.
  • row.names=F를 주는 이유는, 해당 인수를 T로 줄 경우 file로 저장할 때 행 이름이 첫 열로 이동하여 저장되서 그렇습니다.
In [167]:
getwd()
"C:/Users/atara/Documents"
  • 해당 경로를 복사한뒤 아무 폴더나 여시고 주소창에서 빈 공간을 클릭하시고 붙여넣기 하세요
In [173]:
write.table(later,"I_kill_you.txt",row.names=F)
  • txt파일로도 내보내실 수 있습니다.

3.3 write.csv()

In [16]:
write.csv(java,"java.csv",row.names=F)

3.4 write.csv시 row.names=F를 주는 일반적인 이유

  • 같은 파일을 반복해서 읽거나 지우거나 하실 경우 무한 생성이 될 수 있습니다
In [121]:
Java<-read.csv("C:/Users/atara/Dropbox/R-프로그래밍/실습예제/6주차/java.csv")
write.csv(Java,"java.csv",row.names=T)
Java<-read.csv("C:/Users/atara/Dropbox/R-프로그래밍/실습예제/6주차/java.csv")
write.csv(Java,"java.csv",row.names=T)
Java<-read.csv("C:/Users/atara/Dropbox/R-프로그래밍/실습예제/6주차/java.csv")
Java
X.2X.1X순번이름학년언어
11111최재현2학년Java
22223조준희2학년Java
33334남성현2학년Java
44445임동희2학년Java
555517신유빈1학년Java
666622김지현1학년Java
777725안종배3학년Java
888826김소정1학년Java
999927김나현1학년Java
1010101028박태현1학년Java
1111111130윤재건1학년Java
1212121231신현재4학년Java
1313131334채정우1학년Java
  • 물론 읽으실 때 인수를 row.names=1로 주시면 무한 생성은 안됩니다.
    • 선택은 본인의 몫입니다.
In [134]:
Java<-read.csv("C:/Users/atara/Dropbox/R-프로그래밍/실습예제/6주차/java1.csv",row.names=1)
Java
write.csv(Java,"java1.csv",row.names=T)
Java<-read.csv("C:/Users/atara/Dropbox/R-프로그래밍/실습예제/6주차/java1.csv",row.names=1)
Java
write.csv(Java,"java1.csv",row.names=T)
Java<-read.csv("C:/Users/atara/Dropbox/R-프로그래밍/실습예제/6주차/java1.csv",row.names=1)
Java
X학년언어
1최재현2학년Java
3조준희2학년Java
4남성현2학년Java
5임동희2학년Java
17신유빈1학년Java
22김지현1학년Java
25안종배3학년Java
26김소정1학년Java
27김나현1학년Java
28박태현1학년Java
30윤재건1학년Java
31신현재4학년Java
34채정우1학년Java
X학년언어
1최재현2학년Java
3조준희2학년Java
4남성현2학년Java
5임동희2학년Java
17신유빈1학년Java
22김지현1학년Java
25안종배3학년Java
26김소정1학년Java
27김나현1학년Java
28박태현1학년Java
30윤재건1학년Java
31신현재4학년Java
34채정우1학년Java
X학년언어
1최재현2학년Java
3조준희2학년Java
4남성현2학년Java
5임동희2학년Java
17신유빈1학년Java
22김지현1학년Java
25안종배3학년Java
26김소정1학년Java
27김나현1학년Java
28박태현1학년Java
30윤재건1학년Java
31신현재4학년Java
34채정우1학년Java
  • 해당 명령어 역시 read.table과 동일 합니다.

과제

  1. PR6.csv파일을 pr 변수에 읽어보세요
  2. pr을 사용해, python을 선택한 모든 학생들의 정보를 python 변수로 추출해보세요
  3. python 변수를 사용해, 학년별 분포를 알아보세요
  4. python 변수를 python.csv file로 출력해서 제출해주세요. 이 때, 행 이름이 저장됐다면 감점입니다.


Archives

05-16 23:00

Contact Us

Address
경기도 수원시 영통구 원천동 산5번지 아주대학교 다산관 429호

E-mail
textminings@gmail.com

Phone
031-219-2910

Tags

Calendar

«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Copyright © All Rights Reserved
Designed by CMSFactory.NET