R_Language 板


LINE

原問題: 想進一步請問 在一個data.frame中 No1消費者 有A B C D四種消費時間點 A1代表No1 在第一次消費時點的消費金額 A2 A3 A4 A5代表No1第一次消費時點的其他狀態(停留時間、點擊商品數量..等˙) B1 代表No1 在第二次消費時點的消費金額 B2 B3 B4 B5代表No2第二次消費時點的其他狀態 欲拿掉消費金額<5的群組 (即判斷每個群組的第一位是否<5,若<5,則將其消費伴隨的狀態也移除) 剩餘的往左靠齊 No A1 A2 A3 A4 A5 | B1 B2 B3 B4 B5 | C1 C2 C3 C4 C5 | D1 D2 D3 D4 D5 1 5 6 3 2 1 | 10 11 12 13 14 | 1 1 2 3 4 | 5 5 5 5 9 2 1 2 3 4 5 | 1 1 1 1 1 | 5 8 7 6 5 | 5 3 2 1 0 第一位消費者的A1 B1 D1 >=5 則留下ABD三個群組 第二位消費者的C1 D1 >=5 則留下CD 兩個群組 靠右平移 成為以下table | | | No A1 A2 A3 A4 A5 | B1 B2 B3 B4 B5 | C1 C2 C3 C4 C5 | D1 D2 D3 D4 D5 1 5 6 3 2 1 | 10 11 12 13 14 | 5 5 5 5 9 | 2 5 8 7 6 5 | 5 3 2 1 0 | | 我不清楚你原始的column name是否這麼regular... 我定義一個block就是相同名稱開頭的名稱, 例如: A1~A5這樣稱做一個block,B1~B5亦是一個block 我的目標就是根據block的第一個元素去把該block設定為0或是不是0 block設定成0之後就回到你原本的左移案子了~~ 但是要執行這個基本上就是只能用eval了... 因為有太多column不可能,手動去處理這些column 因此,我給了兩個eval方式 一個是用mutate_,另一個是單純的eval 我個人是覺得單純的eval難寫滿多的 但是mutate_要需要相對多的東西才能累積出來... 所以我無法肯定哪一個方法比較好 我自己本身對於mutate_這函數跟lazyeval這個套件都沒有很熟悉 下面的程式提供參考 好讀的程式碼:http://pastebin.com/NCAvfmfP library(data.table) library(dplyr) library(magrittr) N = 10 T = 5 nItem = 4 m = matrix(rbinom(N*T*nItem, 15, 0.4), N) dat = data.table(id = 1:nrow(m), m) %>% setnames(paste0("V",1:20), paste0(rep(LETTERS[1:nItem],,, T), rep(1:T, nItem))) varChecking = names(dat)[grepl("[A-Z]1", names(dat))] f = function(x) ifelse(x < 5, 0, x) dat_out = mutate_each_(dat, funs(f), varChecking) namesWorking = gsub("([A-Z])1", "\\1", varChecking) varsWorking = paste0(rep(namesWorking,,,T-1), rep(2:T,nItem)) ## method 1 cmd = paste0('ifelse(', rep(namesWorking,,,T-1), '1<5,0,', varsWorking, ')') mutate_(dat_out, .dots= setNames(lapply(cmd, lazyeval:::interp), varsWorking)) ## method 2 eval(parse(text = paste0('dat_out=mutate(dat_out,', paste0(varsWorking, '=ifelse(', rep(namesWorking,,,T-1), '1<5,0,', varsWorking, ')', collapse = ","), ')'))) 最後提供一個簡單的方法,但是我怕記憶會爆掉XD varWorking = gsub('([A-Z])\\d', '\\1', names(dat)) %>% unique %>% setdiff('id') llply(varWorking, function(x){ tmp_dat = dat %>% select(starts_with(x)) tmp_dat %<>% setnames(paste0("V", 1:ncol(tmp_dat))) f = function(x) ifelse(tmp_dat$V1 > 5, x, 0) tmp_dat %<>% mutate_each(funs(f)) %>% setnames(paste0(x, 1:ncol(tmp_dat))) tmp_dat }) %>% bind_cols %>% tbl_dt %>% mutate(id = dat$id) 最後補一個執行時間 N = 20000; T = 10; nItem = 1000 method 1: 68.03 method 2: 66.75 method 3: 53.87 測試程式碼:http://pastebin.com/HbVzPh6D 基本上,method 1跟method 2差不多,method 3用空間換時間 所以看你的data.frame大小跟你的記憶體來選適合你的方法吧 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.205.27.107
※ 文章網址: https://webptt.com/m.aspx?n=bbs/R_Language/M.1442325572.A.8B0.html
1F:推 thephone: 謝謝C大 內容對我來講有深度 要好好研究一下09/16 00:22
對我來說,也不簡單,我自己不知道有沒有方法更快。 ※ 編輯: celestialgod (123.205.27.107), 09/16/2015 00:30:29







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Boy-Girl站內搜尋

TOP