楼主: 3314736600
4011 10

求助SAS中怎么是同一行的相应数据相乘然后再加和 [推广有奖]

  • 1关注
  • 0粉丝

初中生

33%

还不是VIP/贵宾

-

威望
0
论坛币
4 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
131 点
帖子
10
精华
0
在线时间
12 小时
注册时间
2016-6-21
最后登录
2016-7-27

楼主
3314736600 发表于 2016-6-21 21:03:46 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
数据是这样的:
  userid\movieid    500   501   502   503   504
   001                   1.2    0.8    0.6    1.3    1.2
   002                   1.0    0.9    1.2    1.1    0.9   003                   1.2    1.1    0.8    1.2    1.3
那么算出来V(001,002)=1.2*1.0+0.8*0.9+0.6*1.2+1.3*1.1+1.2*0.9
                 V (001,003)    =1.2*1.2+0.8*1.1+0.6*0.8+1.3*1.2+1.2*1.3
然后因为userid的个数比较多,所以还要涉及到循环,最终结果就是假设有100个用户,能使用户1与其他99个用户都进行一遍计算,得出99个结果。急求急求。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:UserID Movie seri User use sas SAS SAS数据分析方法 SAS统计分析 SAS过程介绍

回帖推荐

孤单的我们 发表于9楼  查看完整内容

data a; input userid $ _1 _2 _3 _4 _5; cards; 001 1.2 0.8 0.6 1.3 1.2 002 1.0 0.9 1.2 1.1 0.9 003 1.2 1.1 0.8 1.2 1.3 ; run; data b; set a end=stop; array a _:; array _sum _sum1-_sum5; do i=1 to dim(a)-1; _sum{i}+a{i}; end; if stop then output; keep _sum:; run; data c; merge a b ; array a _:; array b b1-b5;*有多少个_开头的变量,这里5就 ...

沙发
3314736600 发表于 2016-6-21 21:04:42
数据格式没对齐,是这样的
userid\movieid    500   501   502   503   504
   001                   1.2    0.8    0.6    1.3    1.2
   002                   1.0    0.9    1.2    1.1    0.9   
   003                   1.2    1.1    0.8    1.2    1.3

藤椅
孤单的我们 发表于 2016-6-22 09:51:34
  1. data a;
  2. input userid $ id500 id501 id502 id503 id504;
  3. cards;
  4. 001 1.2 0.8 0.6 1.3 1.2
  5. 002 1.0 0.9 1.2 1.1 0.9
  6. 003 1.2 1.1 0.8 1.2 1.3
  7. ;
  8. run;

  9. data b1 b2;
  10.         set a;
  11.         if _n_=1 then output b1;
  12.         else output b2;
  13. run;

  14. proc sql noprint;
  15.         create table c as
  16.         select (b1.id500*b2.id500+b1.id501*b2.id501+b1.id502*b2.id502+b1.id503*b2.id503+b1.id504*b2.id504) as v from b1,b2;
  17. quit;
复制代码

板凳
3314736600 发表于 2016-6-22 14:56:09
孤单的我们 发表于 2016-6-22 09:51
有没有循环语句可以解决啊。。。因为总共的movieid有2000多个,userid有900个。。。不能一个个手敲啊。。。而且也不可能对每次计算都分成两个数据集额。。。

报纸
孤单的我们 发表于 2016-6-22 15:25:13
3314736600 发表于 2016-6-22 14:56
有没有循环语句可以解决啊。。。因为总共的movieid有2000多个,userid有900个。。。不能一个个手敲啊。。 ...
data a;
input userid $ id500 id501 id502 id503 id504;
cards;
001 1.2 0.8 0.6 1.3 1.2
002 1.0 0.9 1.2 1.1 0.9
003 1.2 1.1 0.8 1.2 1.3
;
run;

data b;
        set a;
        array a id:;
        array b b1-b5;
        array c c1-c5;
        retain b:;
                do i=1 to dim(a);
                        if _n_=1 then b{i}=a{i};
                        c{i}=a{i}*b{i};
                end;
        if _n_>1 then sum=sum(of c:);        
        drop b: c: i;
run;

地板
3314736600 发表于 2016-6-22 15:55:42
孤单的我们 发表于 2016-6-22 15:25
data a;
input userid $ id500 id501 id502 id503 id504;
cards;
array a id:;这里是什么意思啊,我的表格形式如下: QQ截图20150104155349.png

应该怎么修改

7
孤单的我们 发表于 2016-6-22 16:14:34
3314736600 发表于 2016-6-22 15:55
array a id:;这里是什么意思啊,我的表格形式如下:

应该怎么修改
data b;
        set a;
        array a _:;
        array b b1-b8;*有多少个_开头的变量,这里8就换成几(下同);
        array c c1-c8;
        retain b:;
                do i=1 to dim(a);
                        if _n_=1 then b{i}=a{i};
                        c{i}=a{i}*b{i};
                end;
        if _n_>1 then sum=sum(of c:);        
        drop b: c: i;
run;

8
3314736600 发表于 2016-6-22 17:10:05
孤单的我们 发表于 2016-6-22 16:14
data b;
        set a;
        array a _:;
谢谢您~问题顺利解决了,我还有一个问题额,假设 表格如下:

userid     _1      _2      _3      _4      _5
001      1.2      1.1     0.9     1.1     0.8
002      1.1      0.7     1.4     1.2     0.9
003      1.0      0.9     0.6     1.1     1.4

然后计算过程在刚才的运算上加了一个步骤:
V(i,j)= QQ截图20150104170722.png (Aaj为用户a对电影j的评分,Abj为用户b对电影j的评分,k(yj)为电影j的所有评分和)
例如:
V(001,002)=(1.2*1.1)/(1.2+1.1+1.0)+(1.1*0.7)/(1.1+0.7+0.9)+(0.9*1.4)/(0.9+1.4+0.6)+(1.1*1.2)/(1.1+1.2+1.1)+                                      (0.8*0.9)/(0.8+0.9+1.4)
那要怎么改代码~

9
孤单的我们 发表于 2016-6-23 09:49:48
3314736600 发表于 2016-6-22 17:10
谢谢您~问题顺利解决了,我还有一个问题额,假设 表格如下:

userid     _1      _2      _3      _4  ...
data a;
input userid $ _1 _2 _3 _4 _5;
cards;
001 1.2 0.8 0.6 1.3 1.2
002 1.0 0.9 1.2 1.1 0.9
003 1.2 1.1 0.8 1.2 1.3
;
run;

data b;
        set a end=stop;
        array a _:;
        array _sum _sum1-_sum5;
        do i=1 to dim(a)-1;
                _sum{i}+a{i};
        end;
                if stop then output;
        keep _sum:;
run;

data c;
        merge a b ;
        array a _:;
        array b b1-b5;*有多少个_开头的变量,这里5就换成几(下同);
        array c c1-c5;
                array _sum _sum1-_sum5;
                array d d1-d5;
        retain b: d:;
                do i=1 to dim(b);
                        if _n_=1 then do;b{i}=a{i};d{i}=_sum{i};end;
                        c{i}=a{i}*b{i}/d{i};
                end;
        if _n_>1 then sum=sum(of c:);        
        drop b: c: i _sum: d:;
run;

10
3314736600 发表于 2016-6-23 15:02:37
孤单的我们 发表于 2016-6-23 09:49
data a;
input userid $ _1 _2 _3 _4 _5;
cards;
谢谢您的耐心解答~非常感谢您,这里还有一些细节还劳烦您帮我解释下:
① "array a _:"这里的下划线和冒号是什么含义?是指复制原数据集带有"_"的所有变量的值吗?
②这里a{i}的值就是对应原始数据集 _i 变量所有列值的加和是吗?
③“do i=1 to dim(b);
                        if _n_=1 then do;b{i}=a{i};d{i}=_sum{i};end;
                        c{i}=a{i}*b{i}/d{i};
                end;”
    这个语句中的循环是怎么走的啊,“if _n_=1 then do;b{i}=a{i};d{i}=_sum{i};end;”这句话也不是很懂。。。
④如果我想以第2(第3、第4。。。等等)个用户,求与其他用户的评分相乘再除对应电影总评分的加和,应该怎么写呢?因为你这里设的是if _n_=1,我试着模仿您的代码,在外头包了一个"n=1 to 900"(总用户数)的循环,将“if _n_=1”改成了“if _n_= n”但是结果不对。

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

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