首先读取数据
在R里写出data <- read.csv('clipboard',header=T,sep='\t')但不要按回车,到excel里复制数据后,回到R按回车,即读取数据。
下面查看数据的列名及类型
- > str(data)'data.frame': 390 obs. of 11 variables:
- $ Var1 : num 2535400 2535400 2535401 2535401 2535400 ...
- $ Var2 : Factor w/ 2 levels "Bad","Good": 2 2 1 1 2 1 1 2 2 2 ...
- $ Var3 : num 7.3 8.5 19.2 24.8 108.6 ...
- $ Var4 : num 7.8 9 19.7 24.8 108.6 ...
- $ Var5 : num 2.2 2.2 2.2 0 0 2.2 0 0 2.2 2.2 ...
- $ Var6 : Factor w/ 2 levels "Level A","Level B": 1 1 1 1 1 1 1 1 1 1 ...
- $ Var7 : Factor w/ 4 levels "ID","NH","OH",..: 3 3 3 3 3 3 3 3 1 1 ...
- $ Var8 : int 199907 199907 199907 199907 199907 199911 199911 199907 199909 199907 ...
- $ Var9 : Factor w/ 2 levels "No","Yes": 2 2 2 2 2 2 2 2 2 2 ...
- $ Var10 : Factor w/ 5 levels "IDNo","IDYes",..: 4 4 4 4 4 4 4 4 2 2 ...
- $ Var_Result: int 1052 1052 1052 1052 1052 2552 2552 2552 1552 1552 ...
看到后面你要按时间累积算超标时间,所以将数据按月份排序。
- data <- data[order(data$Var8),]
按你的要求一个一个来
1, 先按照var6 的四个级别 level 分开,把其他变量分类,这样便于把最后算出的结果按照级别单独列到Excel的表格里。
答:没必要这么干,以后分析的时候直接加一条条件data¥var6=="Level A"就好了。例如data[which(data¥Var6=="Level A"),]
2, 每个var1 的个体号码,代表一个个体,他会在一年数个月里去过的地方消费多次,所以var3, var4, var5的值会不同。 但是Var4 是没有优惠的消费额,Var3 是在某些个体但不是全部个体在优惠后的消费额,所以Var4-Var3不总等于0。但是Var5 也是消费额(具体说明看下面的步骤 4), 但是它和 Var4 - Var3的值 不完全相等,所以要统计出哪些var5 和 var4 - var3 是不同的,哪些是相同的,用百分比就可以。
答:which()函数返回符合条件的行数,例如
- > which(data$Var1==66816222800)
- [1] 122 123 124 125 126 178 179 229 230 231 298 351
然后根据行数看数据就好了
这里直接复制代码
- data[which(data$Var1==66816222800),]
- which(data¥Var5!=(data¥Var4-data¥Var3))
- which(data¥Var5==(data¥Var4-data¥Var3))
3, Var7 里的OH, ID之类的是指个体消费过的地方名的简称,Var9里的Yes 和No如果和Var7和并到 var10里就代表是否去过某个具体地方消费。
要求是一般情况下, 一个个体一年里只在一个地方消费,所以一个个体号码不会和 var7 里的 多个地方产生联系。 这个检验也要考虑进去: 如果一个个体在一年里出现在var7 里的两个或以上地方消费, 就要把这些人单独统计出来,把最后的结果按照考虑所有人列出,还有只考虑一个个体一年里只在一个地方消费的列出,前面的其他条件和要求不变。
答:介绍table函数,table作用于单变量时候统计每个项目的频数,table作用于两个变量时统计两者交叉频数。例如
- cross <- table(data¥Var1,data¥Var7)
找出在多个地方有联系的人
- rownames(cross)[which(rowSums(cross==0)<3)]
只在一个地方消费的人
- rownames(cross)[which(rowSums(cross==0)==3)]
如果考虑Var9为No时地址无效,则
- data1 <- data[which(data¥Var9=="Yes"),]
- cross <- table(data1¥Var1,data1¥Var7)
- rownames(cross)[which(rowSums(cross==0)<3)]
- rownames(cross)[which(rowSums(cross==0)==3)]
4,这个Var_Result 是在Var6 单独列到四个级别后对比的标准。
比如说如果var1 里每个个体在一年里在var7里的每个地方消费累计额度 (说的是var5 ) 大于给出的标准Var_Result, 那就要把这个人在一年里哪个月(看var8) 消费累计额度超过标准列出来,这个可以创建一个新变量 叫 beyond_date, 每个个体都应该有个beyond_date。
然后再设置一个新变量叫 beyond_amount 把每个var1 个体在超出标准后的一年剩余时间里的var3 总数算出来。 这种情况下我只对 Var3 是在某些个体但不是全部个体在优惠后的消费额, 感兴趣。
但是如果一个个体在一年里的消费累计额度没有 超过对比的标准 Var_Result 那就把beyond_amount设置为 0,beyond_date设置成 NA。
在算步骤4 的时候注意var2 分两种也就是每个个体可以 是good也可以是bad。 如果是一个个体对应的var2 是good 很简单,这个个体号码最后两位数是00, 但如果对应的 var2 是bad 那么最后两位数是多种情况 01, 02, 03, 04,05,06。
答:用for循环,外层对每个Var1循环,内层按时间排序对每个消费记录循环,其中循环条件我没搞懂你的意思,你自己去调。
超标日期、超标后消费
- id <- names(table(data¥Var1))
- beyond_date[/color] <- rep(NA,length=length(id))
- beyond_amount <- rep(0,length=length(id))
- for(i in 1:length(id)){
- datatemp <- data[which(data¥Var1==id[i]),]
- sum <- 0
- for(j in 1:nrow(datatemp)){
- sum <- sum + datatemp¥Var3[j]
- if(sum>=datatemp¥Var_Result){
- beyond_date[i] <- datatemp¥Var8[j]
- break
- }
- beyond_amount[i] <- sum(datatemp¥Var8[j:nrow(datatemp)])
- }
- }
- cbind(id,beyond_date,beyond_amount)
没明白后面good、bad什么的,反正也就这些函数你自己弄吧。
数据量大的话,循环会很慢,可惜我比较懒就不给你写快的了...


雷达卡

京公网安备 11010802022788号







