8.1 텍스트 파일 입출력
외부 데이터를 불러온다는 것은 외부에 저장되어 있는 파일을 R 작업환경으로 읽어온다는 의미이기 때문에, 현재 작업공간의 작업 디렉토리(working directory) 확인이 필요.
read.table()/write.table()
:- 가장 범용적으로 외부 텍스트 데이터를 R 작업공간으로 데이터 프레임으로 읽고 저장하는 함수
- 텍스트 파일의 형태에 따라 구분자 지정 가능
# read.table(): 텍스트 파일 읽어오기
read.table(
# 파일명. 일반적으로 폴더명 구분자
file, # 보통 folder/파일이름.txt 형태로 입력
header = FALSE, # 첫 번째 행을 헤더(변수명)으로 처리할 지 여부
sep = "", # 구분자 ",", "\t" 등의 형태로 입력
comment.char = "#", # 주석문자 지정
stringsAsFactors = TRUE, # 문자형 변수를 factor으로 변환할 지 여부
encoding = "unknown" # 텍스트의 encoding 보통 CP949 또는 UTF-8
# 한글이 입력된 데이터가 있을 때 사용
)
read.table()
예시
예시에 사용된 데이터들은 Clinical trial data analysis using R (Chen and Peace 2010)에서 제공되는 데이터임.
# tab 구분자 데이터 불러오기
# dataset 폴더에 저장되어 있는 DBP.txt 파일 읽어오기
<- read.table("dataset/DBP.txt", sep = "\t", header = TRUE)
dbp str(dbp)
'data.frame': 40 obs. of 9 variables:
$ Subject: int 1 2 3 4 5 6 7 8 9 10 ...
$ TRT : chr "A" "A" "A" "A" ...
$ DBP1 : int 114 116 119 115 116 117 118 120 114 115 ...
$ DBP2 : int 115 113 115 113 112 112 111 115 112 113 ...
$ DBP3 : int 113 112 113 112 107 113 100 113 113 108 ...
$ DBP4 : int 109 103 104 109 104 104 109 102 109 106 ...
$ DBP5 : int 105 101 98 101 105 102 99 102 103 97 ...
$ Age : int 43 51 48 42 49 47 50 61 43 51 ...
$ Sex : chr "F" "M" "F" "F" ...
# 문자형 값들을 factor로 변환하지 않는 경우
<- read.table("dataset/DBP.txt", sep = "\t",
dbp2 header = TRUE,
stringsAsFactors = FALSE)
str(dbp2)
'data.frame': 40 obs. of 9 variables:
$ Subject: int 1 2 3 4 5 6 7 8 9 10 ...
$ TRT : chr "A" "A" "A" "A" ...
$ DBP1 : int 114 116 119 115 116 117 118 120 114 115 ...
$ DBP2 : int 115 113 115 113 112 112 111 115 112 113 ...
$ DBP3 : int 113 112 113 112 107 113 100 113 113 108 ...
$ DBP4 : int 109 103 104 109 104 104 109 102 109 106 ...
$ DBP5 : int 105 101 98 101 105 102 99 102 103 97 ...
$ Age : int 43 51 48 42 49 47 50 61 43 51 ...
$ Sex : chr "F" "M" "F" "F" ...
# 데이터 형태 파악
head(dbp)
# 콤마 구분자 데이터 불러오기
# dataset 폴더에 저장되어 있는 diabetes_csv.txt 파일 읽어오기
<- read.table("dataset/diabetes_csv.txt", sep = ",", header = TRUE)
diab str(diab)
'data.frame': 403 obs. of 19 variables:
$ id : int 1000 1001 1002 1003 1005 1008 1011 1015 1016 1022 ...
$ chol : int 203 165 228 78 249 248 195 227 177 263 ...
$ stab.glu: int 82 97 92 93 90 94 92 75 87 89 ...
$ hdl : int 56 24 37 12 28 69 41 44 49 40 ...
$ ratio : num 3.6 6.9 6.2 6.5 8.9 ...
$ glyhb : num 4.31 4.44 4.64 4.63 7.72 ...
$ location: chr "Buckingham" "Buckingham" "Buckingham" "Buckingham" ...
$ age : int 46 29 58 67 64 34 30 37 45 55 ...
$ gender : chr "female" "female" "female" "male" ...
$ height : int 62 64 61 67 68 71 69 59 69 63 ...
$ weight : int 121 218 256 119 183 190 191 170 166 202 ...
$ frame : chr "medium" "large" "large" "large" ...
$ bp.1s : int 118 112 190 110 138 132 161 NA 160 108 ...
$ bp.1d : int 59 68 92 50 80 86 112 NA 80 72 ...
$ bp.2s : int NA NA 185 NA NA NA 161 NA 128 NA ...
$ bp.2d : int NA NA 92 NA NA NA 112 NA 86 NA ...
$ waist : int 29 46 49 33 44 36 46 34 34 45 ...
$ hip : int 38 48 57 38 41 42 49 39 40 50 ...
$ time.ppn: int 720 360 180 480 300 195 720 1020 300 240 ...
head(diab)
# Encoding이 다른 경우(한글데이터 포함):
# 한약재 사전 데이터 (CP949 encoding으로 저장)
# tab 구분자 데이터 사용
# UTF-8로 읽어오기
<- read.table("dataset/herb_dic_sample.txt", sep = "\t",
herb header = TRUE,
encoding = "UTF-8",
stringsAsFactors = FALSE)
head(herb)
# CP949로 읽어오기
<- read.table("dataset/herb_dic_sample.txt", sep = "\t",
herb header = TRUE,
encoding = "CP949",
stringsAsFactors = FALSE)
head(herb)
read.table()
+textConnection()
: 웹사이트나 URL에 있는 데이터를Copy + Paste
해서 읽어올 경우 유용하게 사용textConnection()
: 텍스트에서 한 줄씩 읽어 문자형 벡터처럼 인식할 수 있도록 해주는 함수
# Plasma 데이터: http://lib.stat.cmu.edu/datasets/Plasma_Retinol
<- ("64 2 2 21.4838 1 1298.8 57 6.3 0 170.3 1945 890 200 915
input1 76 2 1 23.87631 1 1032.5 50.1 15.8 0 75.8 2653 451 124 727
38 2 2 20.0108 2 2372.3 83.6 19.1 14.1 257.9 6321 660 328 721
40 2 2 25.14062 3 2449.5 97.5 26.5 0.5 332.6 1061 864 153 615
72 2 1 20.98504 1 1952.1 82.6 16.2 0 170.8 2863 1209 92 799
40 2 2 27.52136 3 1366.9 56 9.6 1.3 154.6 1729 1439 148 654
65 2 1 22.01154 2 2213.9 52 28.7 0 255.1 5371 802 258 834
58 2 1 28.75702 1 1595.6 63.4 10.9 0 214.1 823 2571 64 825
35 2 1 23.07662 3 1800.5 57.8 20.3 0.6 233.6 2895 944 218 517
55 2 2 34.96995 3 1263.6 39.6 15.5 0 171.9 3307 493 81 562")
<- ("AGE: Age (years)
input2 SEX: Sex (1=Male, 2=Female).
SMOKSTAT: Smoking status (1=Never, 2=Former, 3=Current Smoker)
QUETELET: Quetelet (weight/(height^2))
VITUSE: Vitamin Use (1=Yes, fairly often, 2=Yes, not often, 3=No)
CALORIES: Number of calories consumed per day.
FAT: Grams of fat consumed per day.
FIBER: Grams of fiber consumed per day.
ALCOHOL: Number of alcoholic drinks consumed per week.
CHOLESTEROL: Cholesterol consumed (mg per day).
BETADIET: Dietary beta-carotene consumed (mcg per day).
RETDIET: Dietary retinol consumed (mcg per day)
BETAPLASMA: Plasma beta-carotene (ng/ml)
RETPLASMA: Plasma Retinol (ng/ml)")
<- read.table(textConnection(input1), sep = "\t", header = F)
plasma <- read.table(textConnection(input2), sep = ":", header = F)
codebook <- gsub("^\\s+", "", codebook$V1) # 변수명 지정
varname
names(plasma) <- varname
head(plasma)
write.table()
: R의 객체(벡터, 행렬, 데이터 프레임)를 저장 후 외부 텍스트 파일로 내보내기 위한 함수
# write.table() R 객체를 텍스트 파일로 저장하기
write.table(
# 저장할 객체 이름
data_obj, # 저장할 위치 및 파일명 또는
file, # 또는 "파일쓰기"를 위한 연결 명칭
# 저장 시 사용할 구분자
sep, row.names = TRUE # 행 이름 저장 여부
)
- 예시
# 위에서 읽어온 plasma 객체를 dataset/plasma.txt 로 내보내기
# 행 이름은 생략, tab으로 데이터 구분
write.table(plasma, "dataset/plasma.txt",
sep = "\t", row.names = F)
- 파일명 대신 Windows clipboard 로 내보내기 가능
# clipboard로 복사 후 excel 시트에 해당 데이터 붙여넣기
# Ctrl + V
write.table(plasma, "clipboard",
sep = "\t", row.names = F)
read.csv()
/write.csv()
:read.table()
함수의 wrapper 함수로 구분자 인수sep
이 콤마(,
)로 고정(예시 생략)
References
Chen, Ding-Geng Din, and Karl E Peace. 2010. Clinical Trial Data Analysis Using r. CRC Press.