데이터분석/R

R언어 공부 - 2

환성 2022. 12. 26. 22:46
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