In [3]:
# date()를 통해 현지 시간 출력
paste("Today is ", date())
In [5]:
# paste0 : 문자 사이에 공백 없이 출력
xs <- 1:7
paste0("A", xs)
In [6]:
paste("A", xs, sep = ",")
In [13]:
letters[1:10] # 소문자 알파벳 출력
paste(letters[1:10], xs, sep = "|")
In [16]:
paste(letters[1:10], xs, sep = "|", collapse = ",")
In [34]:
cs <- "o mapa nao e o territorio"
paste0(cs,", tem ", nchar(cs), "characteres")
In [35]:
# start, end로 문자 뽑아내기
substr(cs, 3, 6)
In [36]:
# 해당 위치 문자 변환
substr(cs, 3, 6) <- "MAPA"
cs
In [42]:
# substr은 결과가 1개 뿐이지만
# substring은 여러개 결과 출력
substring(cs, 2, 4:6)
In [48]:
# strsplit(데이터, 패턴)
# o와 a를 기준으로 문자열을 분리
cs <- "o mapa nao e o territorio"
strsplit(cs,"[oa]")
In [45]:
cs <- paste(letters[1:10],1:7,sep="|",collapse=",")
cs
In [47]:
# ,와 |을 기준으로 문자열을 분리
cs1 <- strsplit(cs,"[,|]")[[1]]
cs1
In [49]:
cs1 <- paste0(cs1,collapse="")
cs1
In [52]:
# 숫자를 기준으로 문자열을 분리
strsplit(cs1,"[1-9]")
In [56]:
# . : 어떠한 문자든 출력 a.b.c.d의 길이 만큼
strsplit("a.b.c.d", ".")
# .d : .d로 끝나는 문자 출력
strsplit("a.b.c.d", ".d")
In [67]:
# .을 이용해서 문자를 분리하려면 \\(escape)사용
strsplit("a.b.c", "\\.")
In [59]:
cs <- c("aaa","abb","ccc","dda","eaa")
In [66]:
# sub : 패턴이 처음 매칭되는 문자 변경
sub("a", "X", cs)
In [65]:
# gsub : 패턴이 매칭되는 모든 문자 변경
gsub("a", "X", cs)
In [69]:
text.test <- "Evidence for a model (or belief) must be considered against alternative models. Let me describe a neutral (and very simple) example: Assume I say I have Extra Sensorial Perception (ESP) and tell you that the next dice throw will be 1. You throw the dice and I was right. That is evidence for my claim of ESP. However there's an alternative model ('just a lucky guess') that also explains it and it's much more likely to be the right model (because ESP needs much more assumptions, many of those in conflict with accepted facts and theories). This is a subject of statistical inference. It's crucial to consider the alternatives when we want to put our beliefs to the test."
text.test
In [70]:
# belief 또는 model 이라는 문자를 XXX로 변경
gsub("belief|model","XXX",text.test)
In [72]:
# t ~~ ?t : t로 둘러쌓여있는 문자중에서
# [a-z]* : 0번 이상 나온 모든 문자들 XXX로 변경
gsub("t([a-z]*)?t","XXX",text.test)
In [76]:
# 반복 문자 지우기
# [a-z]가 2번 반복된 경우
# ex) ee, ss
gsub("([a-z])\\1","YY",text.test)
In [77]:
# model이라는 문자의 좌우에 * 추가
gsub("(model)","*\\1*",text.test)
In [80]:
# vid가 들어가는 부분을 idv로 변경
gsub("(v)(i)(d)","\\2\\3\\1", text.test)
In [82]:
# ([^a-zA-Z]) : 어떤 알파벳으로 시작하던지간에
# ([aA][a-z]+) : 중간에 a 또는 A가 들어가고 소문자로 끝나면
# \\1% : 첫 번째에는 %를 넣고
# \\2* : 두 번째에는 *를 넣어라
gsub("([^a-zA-Z])([aA][a-z]+)","\\1%\\2*",text.test)
In [92]:
gsub("([^a-zA-Z])([a-z]){1,3}([^a-zA-Z])","\\1ZZZ\\3",
text.test)
In [94]:
# , . : 공백 () '로 문자열 분리
separators <- "[,.: ()']"
tokens <- strsplit(text.test, separators)[[1]]
# "" 제거
tokens <- tokens[tokens != ""]
tokens
In [95]:
# dice의 위치가 어디일까요?
grep("dice", tokens, fixed=TRUE)
In [102]:
string <- "abcedabcfaa"
# string 문자열을 알파벳 1개 단위로 분리하고
In [103]:
gsub("([a-z])","\\1,",string)
# 해당 결과를 ,기준으로 다시 분리 => 결과는 list
In [110]:
# strsplit 결과가 list이기에 [[1]] (대괄호 2개)
strsplit(gsub("([a-z])","\\1,",string),",")
In [111]:
cs <- strsplit(gsub("([a-z])","\\1,",string),",")[[1]]
cs
In [113]:
cs <- c("aaa", "axx", "xaa", "axx", "xxx", "xxx")
In [115]:
# regexpr : 처음 매칭되는 요소의 위치를 출력 (-1은 not)
regexpr("a", cs)
In [123]:
# a* : a가 0번 이상 => 전부다 1이겠징
test <- regexpr("a*", cs)
test
# attr을 사용하면 매칭되는 문자의 길이를 알 수 있습니다.
attr(test, "match.length")
In [124]:
cs <- c("123ab67","ab321","10000","0","abc")
In [127]:
# 1: [a-z]* : 소문자 알파벳으로 0번 이상 시작하며
# 2: [0-9]+ : 숫자가 한 번이라도 나오는 cs의 index위치
# [a-z]*([0-9]+) : 알파벳이 0번이상이니 숫자로 시작하는 문자 찾기
# 각 표현식에 대한 결과
regexec("[a-z]*([0-9]+)",cs)
In [131]:
set.seed(101)
# 임시 데이터 20개 생성
pop.data <- paste("the population is",
floor(runif(20,1e3,5e4)),"birds")
head(pop.data)
In [138]:
# 1은 숫자들 중에 처음
# 19는 해당 문자열에서 index가 19 => ([0-9]*) 괄호가 필요
reg.info <- regexec("the population is ([0-9]*) birds",
pop.data)
reg.info[1:3]
In [140]:
# [[1]][1] : ([0-9]*) => 숫자가 포함되는 문자들
# [[1]][2] : 일치하는 패턴만 나타내주는 듯
reg.data <- regmatches(pop.data, reg.info)
reg.data[1:3]
In [142]:
# x[2] 즉 [[1]][2]의 결과를 vector형태로 출력(sapply)
bird.population <- sapply(reg.data, function(x)x[2])
bird.population
In [147]:
set.seed(1303)
# 난수 time series 생성
steps <- sample(-2:2, size=200,
prob=c(.1,.2,.2,.4,.1) ,replace=TRUE)
steps
# 누적합
ts <- cumsum(steps)
plot(ts, type="l")
In [148]:
# 뭐 증가 감소를 나타내는걸 0,1로 표현한듯
difs <- sign(diff(ts)>=0) # 0 if decreased, 1 otherwise
bits <- paste0(difs,collapse="") # colapse into a string of bits
bits
In [149]:
# 00으로 시작되는 부분 index
matches <- gregexpr("00+", bits, perl = T)[[1]]
matches
In [151]:
# 00으로 시작되는 부분 index에 해당하는 length
attributes(matches)$match.length
In [154]:
plot(ts, type="n")
min.y <- rep(min(ts),length(matches))
max.y <- rep(max(ts),length(matches))
rect(matches, min.y, matches+attributes(matches)$match.length, max.y, col="lightgrey", border=FALSE)
points(ts, type="l")
In [8]:
library(stringr)
str1 <- c("o mapa")
str2 <- c("nao e o territorio")
str3 <- str_c(str1,str2, sep=" ") # paste와 동일 결과
str3
str4 <- paste(str1, str2)
str4
In [13]:
# R 내장 letters (소문자 알파벳)
str_c(letters, collapse = ", ") # 소문자
str_c(LETTERS, collapse = ", ") # 대문자
In [14]:
str_length(str3) # 공백포함
In [20]:
str_dup("ab",5) # 하나의 vector로 반환
rep("ab", each = 5) # rep는 반복
In [21]:
str_dup(c("ab","c"),3)
In [22]:
str_dup("ab",1:3)
In [23]:
str3
str_count(str3, "r") # r의 개수
In [24]:
str_detect(str3, "r")
In [27]:
# [it][eo]+ => ie, io, te, to 4개의 케이스중
# 가장 먼저 매칭되는 문자를 찾으세요
str3
str_extract(str3, "[it][eo]+")
str4 <- "ie to istel"
str_extract(str4, "[it][eo]+")
In [28]:
str_extract_all(str3, "[it][eo]+")
In [29]:
str_locate(str3, "[it][eo]+")
In [32]:
str_locate_all(str3, "[it][eo]+")
test <- str_locate_all(str3, "[it][eo]+")
str(test) # 결과는 list형태
In [33]:
str_replace(str3,"r","R") # replace first match
str_replace_all(str3,"r","R") # replace all matches
In [34]:
str_split(str3,"e") # e를 기준으로 문자를 쪼개라
In [35]:
str_split(str3,"e",n=2)
# argument n(결과로 반환될 개수)
# 해당 n이 충족되면 종료
In [36]:
str_sub(str3, 1, 3)
In [37]:
str_sub(str3,
seq(1,24,2), # 1,3,5,7... 23
seq(2,25,2)) # 2,4,6,8... 24
# (1,2) / (3,4) ... (23,24) 순서쌍으로 문자가 출력됨
In [39]:
str4 <- "BBCDEF"
# 특정 문자 위치를 찾아서 변환가능
str_sub(str4, 1, 1) <- "A"
str4
In [47]:
strings <- c(" 219 733 8965", "329-293-8753 ", "banana", "595 794 7569",
"387 287 6718", "apple", "233.398.9187 ", "482 952 3315",
"239 923 8115", "842 566 4692", "Work: 579-499-7527", "$1000",
"Home: 543.355.3679")
phone <- "([2-9][0-9]{2})[- .]([0-9]{3})[- .]([0-9]{4})"
str_extract(strings, phone)
# 정규표현식 ()단위로 하나의 결과가 출력되는 듯
# [2-9][5-9]{2} : (2~9)(0~9)의 숫자가 적어도 2번 반복
# [- .] : - / 공백 / . 이 들어가고
# [0-9]{3} : 3개의 문자가 0~9사이 숫자
# [0-9]{4} : 4개의 문자가 0~9사이 숫자
In [48]:
str_match(strings, phone)
In [51]:
s1 <- str_pad("hadley", 10, "left")
s2 <- str_pad("hadley", 10, "right")
s3 <- str_pad("hadley", 10, "both")
s1; s2; s3
# str_pad 공백 문자 입력 ("문자", 공백 수, 공백 위치)
In [61]:
thanks_path <- file.path(R.home("doc"), "THANKS")
thanks_path
thanks <- str_c(readLines(thanks_path), collapse = "\n")
# 문자열을 한 line씩 읽어오되 \n로 구분해줌
thanks <- word(thanks, 1, 3, fixed("\n\n"))
# extract word index 1~3인 것 같은데?
cat(str_wrap(thanks), "\n")
In [64]:
cat(str_wrap(thanks, width = 40), "\n")
# width 제한
In [69]:
cat(str_wrap(thanks, width = 40, indent =2), "\n")
# indent = 첫 문장 들여쓰기 <-> 내어쓰기(exdent)
In [70]:
sentences <- c("Jane saw a cat", "Jane sat down")
word(sentences, 1)
word(sentences, 2)
word(sentences, -1)
word(sentences, 2, -1)
word(sentences[1], 1:3, -1)
In [73]:
str <- 'abc.def..123.4568.999'
word(str, 1, sep = fixed('..'))
word(str, 2, sep = fixed('..'))