전체 글 (6)

해당 포스트에서는 R에서 문자열(String) 조작 사례를 소개합니다.

string-manipulation-in-r


이번 포스트에서는 다양한 방법을 사용하여 R에서 문자열(String) 조작 방법을 설명합니다. 설명에 사용할 데이터는 아래 코드로 생성 및 활용할 예정입니다.


data <- c("Data science is an interdisciplinary field that uses scientific methods, processes, algorithms and systems to extract knowledge and insights from noisy, structured and unstructured data,[1][2] and apply knowledge and actionable insights from data across a broad range of application domains. Data science is related to data mining, machine learning and big data.",
"",
"Data science is a \"concept to unify statistics, data analysis, informatics, and their related methods\" in order to \"understand and analyze actual phenomena\" with data.[3] It uses techniques and theories drawn from many fields within the context of mathematics, statistics, computer science, information science, and domain knowledge. However, data science is different from computer science and information science. Turing Award winner Jim Gray imagined data science as a \"fourth paradigm\" of science (empirical, theoretical, computational, and now data-driven) and asserted that \"everything about science is changing because of the impact of information technology\" and the data deluge.[4][5]",
"",
"A data scientist is someone who creates programming code, and combines it with statistical knowledge to create insights from data.[6]")

head(data)


data 변수에는 문서 다섯 줄(lines)의 내용이 각각 들어있으며, 아래에서 해당 라인의 예를 볼 수 있습니다.

참고 : Draw a trend line using ggplot-Quick Guide


[1] "Data science is an interdisciplinary field that uses scientific methods, processes, algorithms and systems to extract knowledge and insights from noisy, structured and unstructured data,[1][2] and apply knowledge and actionable insights from data across a broad range of application domains. Data science is related to data mining, machine learning and big data."                                                                                  
[2] ""                                                                                                             
[3] "Data science is a \"concept to unify statistics, data analysis, informatics, and their related methods\" in order to \"understand and analyze actual phenomena\" with data.[3] It uses techniques and theories drawn from many fields within the context of mathematics, statistics, computer science, information science, and domain knowledge. However, data science is different from computer science and information science. Turing Award winner Jim Gray imagined data science as a \"fourth paradigm\" of science (empirical, theoretical, computational, and now data-driven) and asserted that \"everything about science is changing because of the impact of information technology\" and the data deluge.[4][5]"
[4] ""                                                                                                             
[5] "A data scientist is someone who creates programming code, and combines it with statistical knowledge to create insights from data.[6]"

R 문자열 조작

nchar()

nchar() 함수를 사용하면 문자열(String)을 인수로 제공하여 문자열의 문자 수를 계산할 수 있습니다.

nchar(data[1])
[1] 362

data 벡터의 첫 번째 요소는 위 결과에서 보여지듯이 362자로 구성된 문자열입니다.

toupper()

toupper() 함수는 문자열의 모든 문자를 대문자로 변환하는 데 사용할 수 있습니다.

toupper(data[1])
[1] "DATA SCIENCE IS AN INTERDISCIPLINARY FIELD THAT USES SCIENTIFIC METHODS, PROCESSES, ALGORITHMS AND SYSTEMS TO EXTRACT KNOWLEDGE AND INSIGHTS FROM NOISY, STRUCTURED AND UNSTRUCTURED DATA,[1][2] AND APPLY KNOWLEDGE AND ACTIONABLE INSIGHTS FROM DATA ACROSS A BROAD RANGE OF APPLICATION DOMAINS. DATA SCIENCE IS RELATED TO DATA MINING, MACHINE LEARNING AND BIG DATA."

tolower()

위 출력에서 어떻게 표시되는지에 대한 예를 볼 수 있으며, 마찬가지로 모든 문자열의 문자를 소문자로 변경하려면 tolower() 메소드를 사용할 수 있습니다.

tolower(data[1])
[1] "data science is an interdisciplinary field that uses scientific methods, processes, algorithms and systems to extract knowledge and insights from noisy, structured and unstructured data,[1][2] and apply knowledge and actionable insights from data across a broad range of application domains. data science is related to data mining, machine learning and big data."

chartr()

chartr() 함수는 문자열의 특정 문자 집합을 대체하는 데 사용할 수 있습니다.

chartr(" ","-",data[1])

첫 번째 입력은 대체되어야 하는 문자가 포함된 문자열입니다. 대체 문자는 문자열인 두 번째 인수에 저장됩니다.

참고 : Dot Plots in R-Strip Charts for Small Sample Size

마지막 인수는 작업을 적용해야 하는 문자열입니다. 함수가 출력에서 모든 공백 문자를 하이픈(-)으로 대체한 방법을 볼 수 있습니다.

[1] "Data-science-is-an-interdisciplinary-field-that-uses-scientific-methods,-processes,-algorithms-and-systems-to-extract-knowledge-and-insights-from-noisy,-structured-and-unstructured-data,[1][2]-and-apply-knowledge-and-actionable-insights-from-data-across-a-broad-range-of-application-domains.-Data-science-is-related-to-data-mining,-machine-learning-and-big-data."

strsplit()

strsplit() 함수를 사용하면 표현식을 사용하여 문자열을 두 부분으로 분할할 수 있습니다.

mylist <- strsplit(data[1]," ")
mylist
[[1]]
 [1] "Data"              "science"           "is"                "an"               
 [5] "interdisciplinary" "field"             "that"              "uses"             
 [9] "scientific"        "methods,"          "processes,"        "algorithms"       
[13] "and"               "systems"           "to"                "extract"          
[17] "knowledge"         "and"               "insights"          "from"             
[21] "noisy,"            "structured"        "and"               "unstructured"     
[25] "data,[1][2]"       "and"               "apply"             "knowledge"        
[29] "and"               "actionable"        "insights"          "from"             
[33] "data"              "across"            "a"                 "broad"            
[37] "range"             "of"                "application"       "domains."         
[41] "Data"              "science"           "is"                "related"          
[45] "to"                "data"              "mining,"           "machine"          
[49] "learning"          "and"               "big"               "data."

첫 번째 입력은 분할하려는 문자열이고 두 번째 인수는 분할에 사용할 표현식입니다.

공백 문자는 이 상황에서 문자열을 분리하는 데 사용됩니다. 이렇게 하면 목록(list)이 생성되므로 unlist() 메서드를 사용하여 문자형 벡터를 만들어야 합니다.

mylist1 <- unlist(mylist)
mylist1

원래 문자열의 각 단어는 공백 문자로 구분되었으므로 출력을 보면 벡터에 단어당 하나의 요소가 포함되어 있음을 알 수 있습니다.

 [1] "Data"              "science"           "is"                "an"               
 [5] "interdisciplinary" "field"             "that"              "uses"             
 [9] "scientific"        "methods,"          "processes,"        "algorithms"       
[13] "and"               "systems"           "to"                "extract"          
[17] "knowledge"         "and"               "insights"          "from"             
[21] "noisy,"            "structured"        "and"               "unstructured"     
[25] "data,[1][2]"       "and"               "apply"             "knowledge"        
[29] "and"               "actionable"        "insights"          "from"             
[33] "data"              "across"            "a"                 "broad"            
[37] "range"             "of"                "application"       "domains."         
[41] "Data"              "science"           "is"                "related"          
[45] "to"                "data"              "mining,"           "machine"          
[49] "learning"          "and"               "big"               "data."           

sort()

방금 생성한 list1 벡터를 sort() 함수에 입력하여 정렬할 수도 있습니다.

sorting <- sort(mylist1)
sorting
 [1] "a"                 "across"            "actionable"        "algorithms"       
 [5] "an"                "and"               "and"               "and"              
 [9] "and"               "and"               "and"               "application"      
[13] "apply"             "big"               "broad"             "data"             
[17] "data"              "Data"              "Data"              "data,[1][2]"      
[21] "data."             "domains."          "extract"           "field"            
[25] "from"              "from"              "insights"          "insights"         
[29] "interdisciplinary" "is"                "is"                "knowledge"        
[33] "knowledge"         "learning"          "machine"           "methods,"         
[37] "mining,"           "noisy,"            "of"                "processes,"       
[41] "range"             "related"           "science"           "science"          
[45] "scientific"        "structured"        "systems"           "that"             
[49] "to"                "to"                "unstructured"      "uses"

결과적으로 구성 요소는 알파벳순으로 정렬됩니다.

paste()

paste() 함수를 사용하여 문자형 벡터의 요소를 연결할 수도 있습니다.

참고 : Types of Data Visualization Charts > Advantages

paste(sorting, collapse = " ")

고유한 요소를 구분하는 데 사용할 문자열 값은 collapse= 옵션에 의해 결정됩니다.


[1] "a across actionable algorithms an and and and and and and application apply big broad data data Data Data data,[1][2] data. domains. extract field from from insights insights interdisciplinary is is knowledge knowledge learning machine methods, mining, noisy, of processes, range related science science scientific structured systems that to to unstructured uses"

우리는 단순히 하나의 공백 문자를 사용하여 이들을 구분할 것입니다. 알파벳순으로 정렬된 목록은 이 출력에서 단일 문자열로 표시됩니다.

substr()

substr() 함수는 문자열의 지정된 부분을 분리하는 데 사용할 수 있습니다.

subs <- substr(data[1], start = 3, stop = 30)
subs

세그먼트의 시작 및 끝 인덱스를 입력하기만 하면 이 연속된 섹션이 출력됩니다.

[1] "ta science is an interdiscip"


그러나 이 하위 문자열에 선행 및 후행 공백 문자가 있음을 알 수 있습니다.

참고 : What is mean by the best standard deviation?

trimws()

문자열의 시작과 끝에서 공백을 제거하는 trimws() 함수를 사용하여 제거할 수 있습니다. 하위 문자열을 작성하기 위해 마지막 위치에서 거꾸로 계산할 수도 있습니다.


따라서 예를 들어 위에 표시된 것처럼 마지막 5개 문자를 원할 수 있습니다. 이를 위해 stringr 라이브러리의 str_sub() 기능을 사용해야 합니다.

library(stringr)
str_sub(data[1], -5, -1)

이 상황에서 시작 및 끝점 인수가 모두 음수임을 확인하십시오. 결과적으로 시작점은 문자열의 마지막 점에서 다섯 번째 문자이고 끝점은 마지막 문자의 인덱스입니다.

[1] "data."

출력은 마지막 5개 문자가 성공적으로 반환되었음을 보여줍니다.

이제 문자열의 문자를 변경하고, 문자열을 벡터로 분할하고, 특정 하위 문자열을 검색할 수 있어야 합니다.

참고 : tidyverse in r – Complete Tutorial > Unknown Techniques

관련 링크

[1] [R-bloggers] String Manipulation in R



도움이 되셨다면 💗공감 꾸욱 눌러주세요! 😊

해당 포스트에서는 R에서 사용하는 숫자(Number) 데이터 타입을 소개합니다.


r-numbers


R에서는 사용되는 숫자(Number) 데이터 타입은 3가지로 구분됩니다.

  • Numeric : 정수와 부동 소수점 숫자가 포함됩니다. (e.g. 123, 32.43 등)
  • Integer : 정수만 포함되며 보통 L로 표시됩니다. (e.g. 23L, 39L 등)
  • Complex : 허수부가 있는 복소수가 포함됩니다. (e.g. 2+3i, 5i 등)

Numeric Data Type

숫자 데이터 타입은 R에서 가장 자주 사용되는 데이터 타입입니다. 숫자와 함께 변수 선언할 때마다 사용되는 기본 데이터 타입입니다.

숫자 데이터 타입이 있는 변수에 모든 타입의 숫자(소수 포함 또는 제외)를 저장할 수 있습니다. 예를 들어,

# decimal variable
my_decimal <- 123.45
print(class(my_decimal))

# variable without decimal
my_number <- 34
print(class(my_number))
[1] "numeric"
[1] "numeric"

여기서 my_decimalmy_number 변수는 모두 숫자 타입입니다.

Integer Data Type

정수는 소수 없이 값을 가질 수 있는 숫자 데이터 타입입니다. 변수가 미래에도 소수를 가질 수 없다고 확신할 때 주로 사용됩니다.

정수 변수를 생성하려면 값 끝에 접미사 L을 사용해야 합니다. 예를 들어,

my_integer <- 123L

# print the value of my_integer
print(my_integer) 

# print the data type of my_integer
print(class(my_integer))
[1] 123
[1] "integer"

여기서 변수 my_integer123L값을 가지게 됩니다. 값 끝에 있는 접미사 Lmy_integer가 정수 타입임을 나타냅니다.

Complex Data Type

R에서 복소수 데이터 유형을 가지는 변수는 허수부가 있는 값을 포함합니다. i를 접미사로 사용하여 표시할 수 있습니다. 예를 들어,

# variable with only imaginary part
z1 <- 5i
print(z1)
print(class(z1))

# variable with both real and imaginary parts
z2 <- 3 + 3i
print(z2)
print(class(z2))
[1] 0+5i
[1] "complex"
[1] 3+3i
[1] "complex"

여기에서 변수 z1z2는 접미사 i로 표시된 허수부가 있는 복소수 데이터 유형으로 선언되었습니다.

FAQ

숫자(number)를 Numeric 타입으로 변환

R에서는 as.numeric() 함수를 사용하여 숫자를 Numeric 타입으로 변환할 수 있습니다. 예를 들어,

# integer variable
a <- 4L 
print(class(a))

# complex variable
b <- 1 + 2i
print(class(b))

# convert from integer to numeric
x <- as.numeric(a)
print(class(x))

# convert from complex to numeric
y <- as.numeric(b)
print(class(y))
[1] "integer"
[1] "complex"
[1] "numeric"
[1] "numeric"
Warning message:
imaginary parts discarded in coercion 

여기에서 복소수(complex)를 Numeric 타입으로 변환하는 동안 허수부가 버려지는 것을 볼 수 있습니다.

그렇다면 숫자를 복수수(complex) 타입으로 변환하려면 어떻게 해야 할까요?

숫자(number)를 complex 타입으로 변환

R에서는 as.complex() 함수를 사용하여 임의의 숫자를 복소수 값으로 변환할 수 있습니다. 예를 들어,

# integer variable
a <- 4L 
print(class(a))

# numeric variable
b <- 23
print(class(b))

# convert from integer to complex
y <- as.complex(a)
print(class(y))

# convert from numeric to complex
z <- as.complex(b)
print(class(z))
[1] "integer"
[1] "numeric"
[1] "complex"
[1] "complex"

관련 링크

[1] [R-bloggers] R Numbers



도움이 되셨다면 💗공감 꾸욱 눌러주세요! 😊

해당 포스트에서는 R을 이용해 대상 폴더에 들어있는 특정 확장자 파일을 불러오는 방법을 소개합니다.

INTRO

아래 내용은 .csv 또는 .txt와 같은 지정된 파일 확장자를 가진 파일을 읽기 위한 기본 R 코드를 소개합니다. 소개하는 R 코드는 간단하지만 수동으로 읽기에 너무 많은 파일이 있는 경우에 매우 유용합니다.

폴더 내 모든 csv, txt 파일 불러오기

.csv 파일 또는 다른 타입의 파일들이 너무 많이 있는 경우, 이러한 파일을 수동으로 하나씩 읽는 것은 불가능하거나 매우 비효율적입니다.

예를 들어, 대상 디렉토리에 다음과 같은 6개의 파일이 있다고 가정합니다. 처음 4개 파일(csv, CSV, txt, TXT)이 우리가 읽으려는 파일이라면, 파일 내용을 신경쓰지 않아도 되는 지금으로는 간단하게 처리 가능합니다.

  • USD.CSV
  • EUR.csv
  • CNY.TXT
  • AUD.txt
  • CNY2.ttxt
  • USD.CCSV


이 경우 R의 list.files() 함수를 사용하여 특정 파일 확장자를 가진 파일들을 읽을 수 있습니다.

list.files() 함수

list.files()는 주어진 패턴으로 파일 이름 목록을 반환하는 R 내장 함수입니다.

  • R 코드 예시
list.files(path, pattern="\\.(csv|txt)$",
           ignore.case = TRUE, full.names = FALSE)

위의 R 명령어에서 "\\.(csv|txt)$" 패턴은 1) 파일명 끝에 적용($), 2) csv 또는 txt 파일과 같은 다중 파일 확장자((csv| txt))는 허용되지만 ccsv 또는 ttxt(\\.)와 같은 유사한 확장자는 허용되지 않습니다. 대소문자 구분이 무시되므로 csv 및 CSV 또는 txt 및 TXT가 허용됩니다(ignore.case = TRUE).

R 코드

위에서 소개한 list.files() 함수와 반복문을 함께 사용하면 폴더 내 특정 파일 리스트를 추출하는 문제를 쉽게 풀어낼 수 있습니다.

아래 다음 R 코드는 1) 각 csv(CSV) 또는 txt(TXT) 파일을 읽어 각 data.frame을 별도로 만들고, 2) 해당 데이터를 읽어와 하나의 data.frame으로 저장합니다.

#========================================================#
# Quantitative ALM, Financial Econometrics & Derivatives 
# ML/DL using R, Python, Tensorflow by Sang-Heon Lee 
#
# https://kiandlee.blogspot.com
#——————————————————–#
# Basic R : read all csv files when these are so many
#========================================================#

graphics.off()  # clear all graphs
rm(list = ls()) # remove all files from your workspace

# working directory
setwd(“D:/SHLEE/blog/R/many_csv”)

# directory where csv files are located
path<– file.path(getwd())

#——————————————————-
# make a list of all file names with csv or txt ext.
#——————————————————-
# $         : end of file name
# (csv|txt) : multiple file extentions
# \\.       : avoid unwanted cases such as .ccsv
#——————————————————-
v.filename <– list.files(path, pattern=“\\.(csv|txt)$”, 
                         ignore.case = TRUE, 
                         full.names = FALSE)

#——————————————————-
# Test 1) read and make each data.frame
#——————————————————-
for(fn in v.filename) {

    df.each = read.csv(fn)

    print(fn); print(df.each)
}

#——————————————————-
# Test 2) read and collect into one data.frame
#——————————————————-
df.all = do.call(rbind, lapply(v.filename, 
                               function(x) read.csv(x)))
print(df.all)

출력 결과

우리는 출력 결과를 통해 올바른 파일 확장자를 가진 4개의 파일은 정상적으로 읽어왔지만 2개의 원치 않는 파일(.CCSV 및 .ttxt)은 제외되었다는 것을 확인할 수 있습니다.

Read-so-many-CSV-files
[출처] R-BLOGGERS - Basic R : Read so many CSV files


위에서 소개드린 R 코드는 특히 읽을 파일이 너무 많을 때 효율적이고 유용합니다.

관련 링크

[1] [R-BLOGGERS] Basic R : Read so many CSV files


도움이 되셨다면 💗공감 꾸욱 눌러주세요! 😊

해당 포스트에서는 R에 설치된 패키지 목록 및 버전을 확인하는 방법을 소개합니다.

INTRO

아래에서 소개하는 R명령어는 사용자가 설치한 모든 패키지(base 패키지 제외)와 패키지 버전을 나열합니다.

현재 분석 환경을 이동해야 하거나 재설치가 필요한 경우, 아래 명령어를 이용하면 쉽게 패키지 목록을 백업할 수 있습니다.


R코드

ip <- as.data.frame(installed.packages()[,c(1,3:4)])
rownames(ip) <- NULL
ip <- ip[is.na(ip$Priority),1:2,drop=FALSE]
print(ip, row.names=FALSE)

Example output

   Package  Version
  antiword      1.3
   askpass      1.1
assertthat    0.2.1
 backports    1.2.1
 base64enc    0.1-3
        BH 1.75.0-0
       bit    4.0.4
     bit64    4.0.5
      blob    1.2.1
     broom    0.7.8
     callr    3.7.0
cellranger    1.1.0
       cli    3.0.1
     clipr    0.7.1
colorspace    2.0-2
     cpp11    0.3.1
[..snip..]

마무리

이번 포스트에서 소개한 내용은 패키지 버전 관리를 위한 간단한 단계입니다. 더 나은 솔루션은 checkpoint 패키지를 활용하는 방법인데 이는 추후 포스팅하도록 하겠습니다.

해당 코드는 R 4.1.0에서 테스트하였습니다.

관련링크

[1] [R-BLOGGERS] List of user-installed R packages and their versions


blog-logo


도움이 되셨다면 💗공감 꾸욱 눌러주세요! 😊

해당 포스트에서는 R에서 날짜 형식 데이터를 불러오고 변환하는 방법을 소개합니다.

날짜 데이터 불러오기

날짜(Dates)는 base 패키지의 as.Date() 함수를 사용하여 문자, 숫자, POSIXlt 및 POSIXct 형식에서 가져올 수 있습니다. 데이터가 Excel에서 내보낸 경우 숫자 형식일 수 있으며, 그렇지 않으면 대부분 문자 형식으로 저장됩니다.


1. 문자 형식의 날짜 불러오기

날짜(dates)가 문자로 저장되어 있는 경우에는 as.Date() 함수에 '날짜 벡터'와 '날짜가 현재 저장되어 있는 형식'을 입력하면 됩니다.

'날짜가 현재 저장되어 있는 형식'은 아래에서 일부 확인할 수 있는데, 예를 들어 '05/27/84'은 %m/%d/%y형식이고 'May 27 1984'은 %B %d %Y형식 입니다.

만약 as.Dates() 함수를 사용할 때 날짜 형식을 지정하지 않는다면 R에서는 %Y-%m-%d를 시도한 다음 %Y/%m/%d를 시도합니다.


예시 코드 1

> dates <- c("05/27/84", "07/07/05")
> betterDates <- as.Date(dates, format = "%m/%d/%y")
> betterDates
[1] "1984-05-27" "2005-07-07"

예시 코드 2

> dates <- c("May 27 1984", "July 7 2005")
> betterDates <- as.Date(dates, format = "%B %d %Y")
> betterDates
[1] "1984-05-27" "2005-07-07"

2. 숫자 형식의 날짜 불러오기

Excel에서 데이터를 가져오는 경우 숫자 형식의 날짜가 있을 수 있으며, 이 경우에도 as.Date() 함수를 사용해 불러올 수 있습니다. Excel에서 날짜 데이터를 처리할 때 시작하는 날짜를 확인하여 as.Date() 함수에 입력해주면 됩니다.

일반적으로 Windows 용 Excel 이고 1900년 이후 날짜라면 1899년 12월 30일을 입력하면 되고, Mac 용 Excel 이라면 1904년 1월 1일을 입력하면 됩니다.


예시 코드 1 : Windows

# from Windows Excel:
> dates <- c(30829, 38540)
> betterDates <- as.Date(dates, origin = "1899-12-30")
> betterDates
[1] "1984-05-27" "2005-07-07"

예시 코드 2 : Mac

# from Mac Excel:
> dates <- c(29367, 37078)
> betterDates <- as.Date(dates, origin = "1904-01-01")
> betterDates
[1] "1984-05-27" "2005-07-07"

날짜 데이터 형식 변경

표준 날짜 형식인 %Y-%m-%d 이외의 형식으로 날짜를 사용하려면 base 패키지 의 format 옵션을 사용하면 됩니다.

> format(betterDates, "%a %b %d")
[1] "Sun May 27" "Thu Jul 07"

참고 : 날짜 형식

R의-날짜-형식-옵션
[출처] https://www.r-bloggers.com/2013/08/date-formats-in-r/


관련 링크

[1] [R-BLOGGERS] Date Formats in R


blog-logo


도움이 되셨다면 💗공감 꾸욱 눌러주세요! 😊

앞으로 잘 부탁드립니다. ^^