Re: [程式] R 字串比對問題
※ 引述《windguide (夜很深)》之銘言:
: ------------------------------------------------------------------------
: [軟體程式類別]:
: 我盡量描述我的資料格式,希望大家可以了解
: Old Data New Data
: name Description name Description
: Tom John happy hungry energy Kate greedy,lazy,evil
: Mary pretty cute funny Tom happy,kind
: Kate greedy lazy John hungry,energy,angry,crazy
: Cindy sunny Mary pretty,cute
: Jack nice,stupid
: Alan funny,shy,stupid
謝謝你提供的資料範例
: 兩欄之間是以TAB作分隔
: 在name欄中 舊資料與新資料的差異是在同一列中,舊資料會同時有兩個名字
: 新資料則是拆開成兩列,且新資料會有多的人名
: 在 Description欄中,舊資料是以空白作分隔,新資料是逗點;且同一人名新資料
: 會多或少一些描述
: 現在我的目標是產生一個新檔案
: 以新的資料人名為主。舊資料有,新資料沒有的人名,不要。
: 以新資料的人名,去比較新與舊的描述,只要新的描述。舊的有,新的沒有也不要
: 並且以空白作分隔
: 以上述例子,結果會變成
: name Discription
: Kate evil
: Tom kind
: John angry crazy
: Mary
: Jack nice stupid
: Alan funny shy stupid
: 我現在的想法是說 把新舊資料設為matrix
: 將先將舊資料與新資料作match,找出舊資料的index,
: 再依此index對相對應的Discription作處理
: match(new[,1],old[,1])
: 但是此時會產生一個問題,就是在舊資料的 Tom John 這筆資料
: 無法被新資料match到,所以我猜match是精準比對?
: 有無辦法變成部分比對或模糊比對?或者有更好的方式
: 再來就是Discription的部分,我是想找到index後,將相對應的新舊資料
: 再做一次比對,然後取代回新資料。可是這種類似取差集的的過程,有沒有
: 適當的函式可以操作。另外,我也不太懂要如何將資料matrix中的元素
: 以逗號和空白拆開,讓我可以做比對
: 不知各位有沒有其他的想法,文長抱歉
: [程式範例]:
: 雖然張貼程式很可怕,但基本上有些程式還是要張貼才能解決
: -----------------------------------------------------------------------------
考慮到你的資料的特性:
- 基本上會大量使用name(key) --> description(value)的操作
- description項目的欄位長度不定
我會建議用以下的R的資料結構來處理這個問題
old_data <- list()
old_data[["Kate"]] <- c("greedy","lazy")
...
old_data[["Mary"]] <- c("pretty", "cute", "funny")
new_data <- list()
new_data[["Kate"]] <- c("greedy", "lazy", "evil")
...
new_data[["Mary"]] <- c("pretty", "cute")
當轉換成這樣的資料結構之後,你可以使用
setdiff(names(new_data), names(old_data))
來看new_data中多出來的人名
而個別人名的比對可以用
setdiff( new_data[["Kate"]], old_data[["Kate"]] ) 來看new_data比old_data多的
屬性
所以問題只剩下如何把你現有的資料轉換成上述的資料結構了
假設你用read.csv或是其他函數把你的原始資料讀入R
old_data.raw <- read.csv( old_data.filename, stringsAsFactors = FALSE)
如果沒有其他問題(如格式、encoding...)
你應該會得到一個data.frame
old_data.raw
然後一個row一個row的把資料塞到old_data中
name <- strsplit(old_data.raw$name[i], " ", fixed=TRUE)
for(i in 1:nrow(old_data.raw)) {
for(j in 1:length(name[[i]]) {
old_data[[name[[i]][j]]] <- strsplit(old_data.raw$Discription[i],
" ", fixed=TRUE)[[1]]
}
}
new_data的處理方式類似,只是要替換split character
以上方式假設你沒有效能問題(例如資料過大,導致無法讀入記憶體...)
另外如果你要考慮不完全精確的比對,可以看看pmatch這個函數
請參考
--
歡迎加入 Taiwan R User Group : http://www.facebook.com/Tw.R.User
我們每週一都有在「政大公企中心(台北市金華街187號)西樓WB05」
舉辦Machine Learning / Data Mining Monday:
報名 http://www.meetup.com/Taiwan-R/
聚會影片 https://www.youtube.com/user/TWuseRGroup
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.231.66.185
※ 編輯: Wush978 來自: 118.231.66.185 (03/25 18:53)
推
03/26 10:54, , 1F
03/26 10:54, 1F
→
03/28 22:23, , 2F
03/28 22:23, 2F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):