Stats

Popular Posts

Followers

Mathematica 教學 Split 用於資料分組

戴忠淵 於 2012年8月2日星期四 上午8:53 發表
專案說明:用C++寫.exe檔來處理input的data input是.txt檔,data形式如下  1,[1]->[2]->[3]->[4]->[3]->[5] 2,[1]->[3]->[2]->[3]->[1] 3,[1]->[4]->[3]->[5]->[4]->[1] . .  逗號前是data序號,逗號後是user的網頁瀏覽路徑 []內是網頁的代號,視為字串即可,數字大小不代表順序 ->是箭頭,表示路徑順序 不同序號的路徑彼此獨立,不用考慮重複情形  我想要將user的瀏覽路徑切成向前與向後 向前指的是該user到目前為止瀏覽的網頁都未重複 向後指的是該user到目前為止瀏覽的網頁都有重複 方向改變的話就output,未改變的話就繼續算  以上例編號1的路徑來說明 原始是1,[1]->[2]->[3]->[4]->[3]->[5] 首先[1]->[2],[2]未曾出現於此路徑,故[1]->[2]是向前 再看[2]->[3],[3]未曾出現於此路徑,故[1]->[2]->[3]是向前 再看[3]->[4],[4]未曾出現於此路徑,故[1]->[2]->[3]->[4]是向前 接著[4]->[3],[3]已經出現過,故[4]->[3]是向後(方向改變了) 最後[3]->[5],[5]未曾出現於此路徑,故[3]->[5]是向前(方向改變)  所有筆數以此規則run完後 最後output兩個txt檔,一個是向前.txt,一個是向後.txt 向前.txt裡面就會是向後.txt裡面就會是 1,[1]->[2]->[3]->[4]1,[4]->[3] 1,[3]->[5]2,[2]->[3]->[1] 2,[1]->[3]->[2]3,[5]->[4]->[1] 3,[1]->[4]->[3]->[5]

Split妙用~~

split[mystring_String]:=Block[{forward,backward,trans,transdata},

(* 將數字以外的字元刪除並轉換為陣列 *)
trans=ToExpression@StringSplit[StringReplace[mystring,{"["|"]"->""}],"\[Rule]"];

(* 檢查數字是否為重複數字 *)

transdata=Table[{trans[[z]],FreeQ[trans[[1;;z-1]],trans[[z]]]},{z,1,Length@trans}];

(* 檢查兩陣列資料的第二的元素是否為True,是的話歸為同一組 *)
forward=Select[Split[transdata,#2[[2]]==True&],Length@#>1&][[All,All,1]];

(* 檢查兩陣列資料的第二的元素是否為False,是的話歸為同一組 *)
backward=Select[Split[transdata,#2[[2]]==False&],Length@#>1&][[All,All,1]];

{forward,backward}
]

data={{1,"[1]\[Rule][2]\[Rule][3]\[Rule][4]\[Rule][3]\[Rule][5]"},
{2,"[1]\[Rule][3]\[Rule][2]\[Rule][3]\[Rule][1]"},
{3,"[1]\[Rule][4]\[Rule][3]\[Rule][5]\[Rule][4]\[Rule][1]"}};

{#,split[data[[#,2]]]}&/@Range[Length@data]
Tags: , ,

讀者回應 ( 0 意見 )

發佈留言

Please leave your name and tell me what you thought about this site. Comments, suggestions and views are welcomed.

如果這篇文章對你有幫助,那請留個訊息給我~