728x90
1 ) 자릿수 더 적게(많게) 출력하기
print에서 digits 인자는 출력되는 자릿수 조정 가능, cat에서는 format 함수로 숫자의 형식을 수정
> print(pi, digits=4)
[1] 3.142
> print(pi, digits = 10)
[1] 3.141592654
# cat 함수에서는 형식을 바로 지정 X, format함수로 숫자 형식을 바꾸고 사용
> cat(pi, "\n")
3.141593
> cat(format(pi, digits=4), "\n")
3.142
# 모든 숫자가 동일한 길이를 가지도록 형식 지정
# 테이블 전체의 형식을 지정할 때
> q <- seq(from = 0, to = 3, by = 0.5)
> tbl <-data.frame(Quant = q, Lower = pnorm(-q), Upper = pnorm(q))
> tbl
Quant Lower Upper
1 0.0 0.500000000 0.5000000
2 0.5 0.308537539 0.6914625
3 1.0 0.158655254 0.8413447
4 1.5 0.066807201 0.9331928
5 2.0 0.022750132 0.9772499
6 2.5 0.006209665 0.9937903
7 3.0 0.001349898 0.9986501
> print(tbl, digits = 3)
Quant Lower Upper
1 0.0 0.50000 0.500
2 0.5 0.30854 0.691
3 1.0 0.15866 0.841
4 1.5 0.06681 0.933
5 2.0 0.02275 0.977
6 2.5 0.00621 0.994
7 3.0 0.00135 0.999
2) 출력을 파일에 쓰기
R의 출력을 파일로 리다이렉션하고 싶을 때 file인자를 사용하면 cat 함수의 출력을 리다이렉션 할 수 있다.
# 사용 방식
cat("The number is", number, "\n", file = "파일이름.txt")
# sink 함수 사용시 print와 cat의 모든 출력을 리다이렉션 할 수 있음
sink("파일이름") # 출력을 파일에 쓰기
sink() # 출력을 다시 콘솔에 쓰기
# 반복적으로 cat을 사용하여 하나의 파일에 출력을 넣고 있다면 append=TRUE로 설정해야한다
# 아니면 기존의 내용을 계속 덮어쓰게 되기 때문
cat(data, file = "a.txt")
cat(results, file = "a.txt", append = TRUE)
3) 고정폭 레코드 읽기
readr 패키지 (tidyverse)에 있는 read_fwf 함수를 사용한다. 넣어 줘야 하는 주요 인자는 파일 이름과 필드에 대한 설명이다.
> file <- "./fixed-width.txt"
> t1 <- read_fwf(file, fwf_empty(file, colnames = c("last", "first", "birth", "death")))
> records <- read_fwf("fixed-width.txt", fwf_cols(col1 = 10, col2 = 7))
Rows: 5 Columns: 2
── Column specification ───────────────────────────────────────────────
chr (2): col1, col2
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# fwf_widths를 사용해 각 열을 정의
> t2 <- read_fwf(file, fwf_widths(c(10,10,5,4), c("last", "first", "birth", "death")))
Rows: 5 Columns: 4
── Column specification ───────────────────────────────────────────────
chr (2): last, first
dbl (1): birth
lgl (1): death
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# 열은 fwf_cols로도 정의가 가능하다
> t3 <- read_fwf("C:/Users/admin/Documents/fixed-width.fwf",
fwf_cols(last = 10,
first = 10,
birth = 5,
death = 5))
4) csv 파일에서 읽어오기
readr 패키지의 read_csv 함수는 csv 파일을 읽기 위한 빠른 방법이다. 또한 URL을 사용해서 연결을 읽는 방법도 존재한다.
> library(tidyverse)
> tbl <- read_csv("auto-mpg.csv")
Rows: 398 Columns: 9
── Column specification ───────────────────────────────────────────────
Delimiter: ","
chr (2): horsepower, car_name
dbl (7): mpg, cylinders, displacement, weight, acceleration, model_...
# csv 파일이 헤더 라인이 없을시 col_names = FALSE로 설정
> tbl <- read_csv("auto-mpg.csv", col_names = FALSE)
> tbl
# A tibble: 399 × 9
X1 X2 X3 X4 X5 X6 X7 X8 X9
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 mpg cylinders displacement horsepow… weig… acce… mode… orig… car_…
2 18 8 307 130 3504 12 70 1 chev…
3 15 8 350 165 3693 11.5 70 1 buic…
4 18 8 318 150 3436 11 70 1 plym…
5 16 8 304 150 3433 12 70 1 amc …
6 17 8 302 140 3449 10.5 70 1 ford…
7 15 8 429 198 4341 10 70 1 ford…
8 14 8 454 220 4354 9 70 1 chev…
9 14 8 440 215 4312 8.5 70 1 plym…
10 14 8 455 225 4425 10 70 1 pont…
# … with 389 more rows
# read_csv 함수의 경우 데이터를 읽은뒤 티블로 만든다
# 티블이란 R 데이터 객체를 말한다(data.frame 객체 형태와 차이 X)
> tbl
# A tibble: 398 × 9
mpg cylinders displacement horsepower weight acceleration
<dbl> <dbl> <dbl> <chr> <dbl> <dbl>
1 18 8 307 130 3504 12
2 15 8 350 165 3693 11.5
3 18 8 318 150 3436 11
4 16 8 304 150 3433 12
5 17 8 302 140 3449 10.5
6 15 8 429 198 4341 10
7 14 8 454 220 4354 9
8 14 8 440 215 4312 8.5
9 14 8 455 225 4425 10
10 15 8 390 190 3850 8.5
# … with 388 more rows, and 3 more variables: model_year <dbl>,
# origin <dbl>, car_name <chr>
# URL을 사용해서 csv파일 읽기
> berkley <- read_csv('http://bit.ly/barkley18', comment = '#')
Rows: 26 Columns: 3
── Column specification ───────────────────────────────────────────────
Delimiter: ","
chr (2): Name, Location
time (1): Time
> berkley
# A tibble: 26 × 3
Name Location Time
<chr> <chr> <time>
1 Gary Robbins CAN 08:38:08
2 Allie Beaven SCO 08:38:09
3 Guillaume Calmettes CA 08:38:10
4 Jamil Coury AZ 08:58:55
5 Benoit Laval FRA 09:07:15
6 Valery Caussarieu FRA 09:07:20
7 Jodi Isenor CAN 09:23:31
8 Johan Steene SWE 09:56:54
9 Scott Martin OR 09:56:55
10 Josep Barbarillo ESP 10:53:15
# … with 16 more rows
na = c("", "NA") # 결측값을 나타내는 값
comment = "" # 주석
trim_ws = TRUE # 필드의 시작/끝에서 공백을 없앨 것인지 여부
skip = 0 # 파일의 시작에서 건너뛸 행의 개수
guess_max = min(1000, n_max) # 열의 형식을 추측할 때 고려할 행의 개수
5) 데이터 프레임을 엑셀로 쓰기
openxlsx 패키지를 사용하면 된다.
> library(openxlsx)
> write.xlsx(df, sheetName = "어떤_시트", file = "출력_파일.xlsx")
6) HTML 테이블에서 데이터 읽어오기
rvest 패키지의 read_html과 html_table 함수를 사용한다.
> library(rvest)
> library(tidyverse)
> all_tables <- read_html("https://en.wikipedia.org/wiki/Aviation_accidents_and_incidents") %>%
+ html_table(fill = TRUE, header = TRUE)
> all_tables
[[2]]
# A tibble: 52 × 3
Year `Deaths[58]` `Number of incidents[59]`
<int> <chr> <int>
1 1970 2,226 298
2 1971 2,228 271
3 1972 3,346 344
4 1973 2,814 333
5 1974 2,621 270
6 1975 1,856 316
7 1976 2,419 277
8 1977 2,449 340
9 1978 2,042 356
10 1979 2,511 328
# … with 42 more rows
# 리스트에서 하나의 테이블만 꺼내러면, magrittr 패키지의 extract2 함수 사용
> out_table <- all_tables %>%
+ magrittr::extract2(2)
> head(out_table)
# A tibble: 6 × 3
Year `Deaths[58]` `Number of incidents[59]`
<int> <chr> <int>
1 1970 2,226 298
2 1971 2,228 271
3 1972 3,346 344
4 1973 2,814 333
5 1974 2,621 270
6 1975 1,856 316
7) 복잡한 구조를 가진 파일 읽기
readLines 함수를 사용해 개별 라인을 읽고 문자열로 처리해서 데이터 항목을 추출한다.
또 다른 방법으론 scan 함수를 사용하여 파일의 내용을 토큰 스트림으로 읽되, what 인자를 사용하여 각 토큰의 형식을 기술한다. scan 함수는 토큰일 데이터로 변환하고 데이터를 모아 레코드로 만들 수 있다.
# 예시
input <- readLines("input.txt", n = 10) # 읽어올 최대 개수 지정하는 n 인자
# what 인자
what = numeric(0) # 토큰을 숫자로 해석
what = integer(0) # 토큰을 정수로 해석
what = complex(0) # 토큰을 복소수로 해석
what = character(0) # 토큰을 문자열로 해석
what = logical(0) # 토큰을 논릿값으로 해석
# 예시
> world.series <- scan('http://lib.stat.cmu.edu/datasets/wseries', skip = 35, nlines = 23,
what = list(year = integer(0), pattern = character(0)))
> world.series$year
[1] 1903 1927 1950 1973 1905 1928 1951 1974 1906 1929 1952 1975 1907
[14] 1930 1953 1976 1908 1931 1954 1977 1909 1932 1955 1978 1910 1933
[27] 1956 1979 1911 1934 1957 1980 1912 1935 1958 1981 1913 1936 1959
[40] 1982 1914 1937 1960 1983 1915 1938 1961 1984 1916 1939 1962 1985
[53] 1917 1940 1963 1986 1918 1941 1964 1987 1919 1942 1965 1988 1920
[66] 1943 1966 1989 1921 1944 1967 1990 1922 1945 1968 1991 1923 1946
[79] 1969 1992 1924 1947 1970 1993 1925 1948 1971 1926 1949 1972
# 다시 시간순으로 정리
> world.series <- list(year = world.series$year[perm], pattern = world.series$pattern[perm])
> world.series$year
[1] 1903 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916
[14] 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929
[27] 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942
[40] 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955
[53] 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968
[66] 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981
[79] 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993
8) 객체 저장 및 전송
save 함수를 사용해 객체들을 파일로 쓰고 load 함수를 사용해 컴퓨터로 다시 읽어 들인다.
save 함수는 바이너리 데이터를 작성(파일의 크기를 작게 하기 위해서), ASCII 형식으로 저장하려면 dput이나 dump 사용한다.
# save 함수 사용
save(tbl, t, file = "myData.RData")
# load 함수 사용
load("myData.RData")
# dput, dump 사용
dput(tbl, file = "myData.txt")
dump("tbl", file = "myData.txt")
'데이터분석 > R' 카테고리의 다른 글
R언어 공부 - 6 (0) | 2022.12.30 |
---|---|
R언어 공부 - 5 (3) | 2022.12.29 |
R언어 공부 - 4 (0) | 2022.12.27 |
R언어 공부 - 3 (0) | 2022.12.27 |
R언어 공부 - 1 (0) | 2022.12.26 |