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/cn.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灯, 水草

请输入看板名称,例如:e-shopping站内搜寻

TOP