文字處理簡介

林嶔 (Lin, Chin)

Lesson 11

第一節:基本文字操作(1)

– 在R的字串處理中要小心注意character、factor、numeric這三種類別的誤轉換和混用,尤其是factor是一種很討厭的格式,因為它在轉成數字和字串的時候,常常會變成跟原本不一樣的東西

1-1. 字串黏合(不同物件)

paste("A", "B", sep = "")
## [1] "AB"

1-2. 字串黏合(同物件)

paste(c("A", "B"), collapse = "")
## [1] "AB"
  1. 字串分割
strsplit("A.B", split = "." , fixed = TRUE)
## [[1]]
## [1] "A" "B"
  1. 部份穩合
x = c("AB", "AA")
grepl("B", x)
## [1]  TRUE FALSE
grepl("A", x)
## [1] TRUE TRUE
  1. 回傳出現位置
x = c("ABABC", "CCAAE")
gregexpr("A", x)
## [[1]]
## [1] 1 3
## attr(,"match.length")
## [1] 1 1
## attr(,"useBytes")
## [1] TRUE
## 
## [[2]]
## [1] 3 4
## attr(,"match.length")
## [1] 1 1
## attr(,"useBytes")
## [1] TRUE
  1. 子字串
substr("ndmc1234", 1, 4)
## [1] "ndmc"
  1. 字元取代
x = "AABB"
gsub("A", "C", x)
## [1] "CCBB"
  1. 計算字串長度
x = c("A","AAA","AAAAA")
nchar(x)
## [1] 1 3 5
  1. 大小寫切換
tolower("aBcDe")
## [1] "abcde"
toupper("aBcDe")
## [1] "ABCDE"

第一節:基本文字操作(2)

– 這是第一種作法,使用函數「strsplit」做字串分割:

emails = c("xup6fup@mail.ndmctsgh.edu.tw", "xup6fup0629@gmail.com")

n.account = length(emails)
accounts = rep("", n.account)

splited_emails = strsplit(emails, split = "@" , fixed = TRUE)

for (i in 1:n.account) {
  accounts[i] = splited_emails[[i]][1]
}

accounts
## [1] "xup6fup"     "xup6fup0629"

– 這是第二種作法,先使用函數「gregexpr」回傳「@」出現位置,再使用函數「substr」分離字串:

emails = c("xup6fup@mail.ndmctsgh.edu.tw", "xup6fup0629@gmail.com")

n.account = length(emails)
accounts = rep("", n.account)

symbol_pos = gregexpr("@" , emails, fixed = TRUE)

for (i in 1:n.account) {
  accounts[i] = substr(emails[i], 1, symbol_pos[[i]][1] - 1)
}

accounts
## [1] "xup6fup"     "xup6fup0629"

練習1:處理半格式化的文字資料

– 我們這裡要用到函數「readLines」來進行讀檔:

dat = readLines("102年9月.txt", encoding = "UTF-8")
head(dat)
## [1] "2013年9月份海盜案件紀要(東南亞地區)" "資料來源:馬來西亞海盜報案中心(PRC) "
## [3] "1.\t日期:2013年9月3日"              "時間:世界時間1410"                 
## [5] "經緯度:北緯10度13分、東經107度02分" "地點:越南"

– 如果你能完全轉變完,那你將有機會搭配上一節課所學到的地理資訊視覺化方式,把海盜出沒的熱點全部標記在地圖上!

library(RgoogleMaps)

lon = c(107.02, 103.3444, 112.402, 117.417, 103.37, 104.05, 98.45)
lat = c(10.13, 1.0918, -7.099, -0.164, 1.07, 4.52, 3.58)

center = c(mean(lat), mean(lon))
zoom = min(MaxZoom(range(lat), range(lon)))

MysubMap = GetMap(center = center, zoom = zoom, maptype = "satellite", API_console_key = 'AIzaSyA4DVFtF70aXE7RgrXViy2z5Ku2pMkVxFI')
PlotOnStaticMap(MysubMap)

PlotOnStaticMap(MysubMap, lat = lat, lon = lon, pch = 19, col = '#FF000080', add = TRUE)