楼主: reduce_fat
716 11

[问答] 重金 888 悬赏 SAS 或 R 语言编程实际问题 [推广有奖]

11
万人往LVR 在职认证  发表于 2015-11-7 11:42:14
东西太多,我又太懒,把需要的函数列出来你自己做吧。论坛里面写美元符号会出异常,这里我都写成¥,在R里你自己改回来。
首先读取数据
在R里写出data <- read.csv('clipboard',header=T,sep='\t')但不要按回车,到excel里复制数据后,回到R按回车,即读取数据。
下面查看数据的列名及类型
  1. > str(data)'data.frame':   390 obs. of  11 variables:
  2. $ Var1      : num  2535400 2535400 2535401 2535401 2535400 ...
  3. $ Var2      : Factor w/ 2 levels "Bad","Good": 2 2 1 1 2 1 1 2 2 2 ...
  4. $ Var3      : num  7.3 8.5 19.2 24.8 108.6 ...
  5. $ Var4      : num  7.8 9 19.7 24.8 108.6 ...
  6. $ Var5      : num  2.2 2.2 2.2 0 0 2.2 0 0 2.2 2.2 ...
  7. $ Var6      : Factor w/ 2 levels "Level A","Level B": 1 1 1 1 1 1 1 1 1 1 ...
  8. $ Var7      : Factor w/ 4 levels "ID","NH","OH",..: 3 3 3 3 3 3 3 3 1 1 ...
  9. $ Var8      : int  199907 199907 199907 199907 199907 199911 199911 199907 199909 199907 ...
  10. $ Var9      : Factor w/ 2 levels "No","Yes": 2 2 2 2 2 2 2 2 2 2 ...
  11. $ Var10     : Factor w/ 5 levels "IDNo","IDYes",..: 4 4 4 4 4 4 4 4 2 2 ...
  12. $ Var_Result: int  1052 1052 1052 1052 1052 2552 2552 2552 1552 1552 ...
复制代码

看到后面你要按时间累积算超标时间,所以将数据按月份排序。
  1. 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()函数返回符合条件的行数,例如
  1. > which(data$Var1==66816222800)
  2. [1] 122 123 124 125 126 178 179 229 230 231 298 351
复制代码

然后根据行数看数据就好了
  1. data[which(data$Var1==66816222800),]
复制代码
这里直接
  1. which(data¥Var5!=(data¥Var4-data¥Var3))
  2. which(data¥Var5==(data¥Var4-data¥Var3))
复制代码

3, Var7 里的OH, ID之类的是指个体消费过的地方名的简称,Var9里的Yes 和No如果和Var7和并到 var10里就代表是否去过某个具体地方消费。
要求是一般情况下, 一个个体一年里只在一个地方消费,所以一个个体号码不会和 var7 里的 多个地方产生联系。 这个检验也要考虑进去: 如果一个个体在一年里出现在var7 里的两个或以上地方消费, 就要把这些人单独统计出来,把最后的结果按照考虑所有人列出,还有只考虑一个个体一年里只在一个地方消费的列出,前面的其他条件和要求不变。
答:介绍table函数,table作用于单变量时候统计每个项目的频数,table作用于两个变量时统计两者交叉频数。例如
  1. cross <- table(data¥Var1,data¥Var7)
复制代码

找出在多个地方有联系的人
  1. rownames(cross)[which(rowSums(cross==0)<3)]
复制代码

只在一个地方消费的人
  1. rownames(cross)[which(rowSums(cross==0)==3)]
复制代码

如果考虑Var9为No时地址无效,则
  1. data1 <- data[which(data¥Var9=="Yes"),]
  2. cross <- table(data1¥Var1,data1¥Var7)
  3. rownames(cross)[which(rowSums(cross==0)<3)]
  4. 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循环,内层按时间排序对每个消费记录循环,其中循环条件我没搞懂你的意思,你自己去调。
超标日期、超标后消费
  1. id <- names(table(data¥Var1))
  2. beyond_date[/color] <- rep(NA,length=length(id))
  3. beyond_amount <- rep(0,length=length(id))
  4. for(i in 1:length(id)){
  5.     datatemp <- data[which(data¥Var1==id[i]),]
  6.     sum <- 0
  7.     for(j in 1:nrow(datatemp)){
  8.         sum <- sum + datatemp¥Var3[j]
  9.         if(sum>=datatemp¥Var_Result){
  10.             beyond_date[i] <- datatemp¥Var8[j]
  11.             break
  12.         }
  13.         beyond_amount[i] <- sum(datatemp¥Var8[j:nrow(datatemp)])
  14.     }
  15. }
  16. cbind(id,beyond_date,beyond_amount)
复制代码





没明白后面good、bad什么的,反正也就这些函数你自己弄吧。
数据量大的话,循环会很慢,可惜我比较懒就不给你写快的了...




已有 1 人评分经验 学术水平 热心指数 信用等级 收起 理由
reduce_fat + 100 + 5 + 5 + 5 观点有启发

总评分: 经验 + 100  学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

12
reduce_fat 发表于 2015-11-8 01:52:52
万人往LVR 发表于 2015-11-7 11:42
东西太多,我又太懒,把需要的函数列出来你自己做吧。论坛里面写美元符号会出异常,这里我都写成¥,在R里你 ...
不需要读取数据, 我已经把接近1 GB的数据全部用csv 的格式输入到R 里面了。 那个good, bad 我可以自己弄,这只是个例子的数据,所以你可能看不懂我具体要做什么。

我会先试验一下你给出的其他步骤,有不懂的问题,再陆续跟进。 谢谢。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-24 17:34