20622 9

请教高人如何将纵向排列的数据转为横向排列 [推广有奖]

  • 0关注
  • 1粉丝

高中生

0%

还不是VIP/贵宾

-

威望
0
论坛币
23 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
197 点
帖子
23
精华
0
在线时间
4 小时
注册时间
2009-2-9
最后登录
2013-5-25

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币

请教高手,如何将纵向排列的各组数据,变为横向排列的(比如按照变量code依次将观测值横向排列)?

另外,由于各个股票所对应的观测值个数不同,比如0001对应3个观测,0002对应2个观测,0003对应1个观测,在排列时如何将这些观测值以最后一条观测值对齐?恳请指点,谢谢!

比如,原数据集为

code return dummy year

0001  0.35      0       2004

0001  0.86      1       2005

0001  1.92      0       2006

0002  2.34      0       2005

0002  0.19      1       2006

0004 3.73 1 2006

目标数据集:

code return dummy year   code return dummy year   code return dummy year

0001   0.35      0    2004

0001   0.86      1    2005   0002  2.34     0       2005

0001   1.92      0    2006   0002  0.19     1       2006    0004 3.73      1      2006

[此贴子已经被作者于2009-3-23 19:44:06编辑过]

二维码

扫码加我 拉你入群

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

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

关键词:请教高人 RETURN Dummy code year 数据 高人 排列

回帖推荐

steve10 发表于4楼  查看完整内容

首先仔细看一下你的数据,在最后的结果里你不需要三个“year”,一个就够了;此外,你不能有两个以上相同的变量名,所以,你最后会有code1,code2, code3, 等。data data0; input code $ return dummy year; datalines; 0001  0.35      0       20040001  0.86      1       20050001&n ...

officezhushou 发表于7楼  查看完整内容

在Excel中将横向排列的数据转换为纵向排列,在上文中,我们讲解了通常用的方法:Excel中数据从横向排列到纵向排列的转换的方法,实际上那是通过选择性粘贴的转置功能实现的简单将横向排列的数据转换为纵向排列,但很多情况下无法使用“转置”的功能,例如下图A1:G17区域为某网店部分商品的库存数量,“商品尺寸”是横向排列的,现在需要将这些数据按纵向排列,即将“商品尺寸”及其对应的“货号”、“数量”排列到三列中,如图J至L ...

本帖被以下文库推荐

沙发
wantflying1999 发表于 2009-3-23 20:53:00 |只看作者 |坛友微信交流群

首先将原数据集拷入EXCEL,然后选择该数据集所在的区域,按右键选择复制,然后选择另外一个工作表,按按右键选择“选择性粘贴”,选择转置即可。

使用道具

藤椅
yangshuaixd 发表于 2009-3-23 21:05:00 |只看作者 |坛友微信交流群
这哪儿是简单转置事儿啊?这也不是把纵向转为横向嘛,我看只有手动了,呵呵

使用道具

板凳
steve10 发表于 2009-3-24 01:31:00 |只看作者 |坛友微信交流群

首先仔细看一下你的数据,在最后的结果里你不需要三个“year”,一个就够了;此外,你不能有两个以上相同的变量名,所以,你最后会有code1,code2, code3, 等。

data data0;
 input code $ return dummy year;
 datalines; 
0001  0.35      0       2004
0001  0.86      1       2005
0001  1.92      0       2006
0002  2.34      0       2005
0002  0.19      1       2006
0004 3.73 1 2006
;
run;

proc sort data = data0;
 by code year;
run;

proc sql;
 create table code_set as
 select distinct code
 from data0
 order by code;
run;

data _null_;
  set code_set NOBS=count;
  if _n_=1 then call symput("num_codes",left(put(count,8.)));
run;

%macro a_macro;

 %do i=1 %to &num_codes;

  data _null_;
   set code_set;
   if _n_=&i then call symput("code",trim(left(code)));
  run;

  data temp;
   set data0;
   if code="&code";
   
  run;

  %if &i=1 %then %do;

   data all;
    set temp;
    keep year;
   run;

  %end;

  data temp;
   set temp;
   rename code=code&i;
   rename dummy=dummy&i;
   rename return =return&i;
  run;

  data all;
   merge all temp;
   by year;
  run;

 %end;

%mend a_macro;

%a_macro;

quit;

已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

总评分: 经验 + 3  论坛币 + 3   查看全部评分

使用道具

报纸
rdzr 发表于 2009-3-24 12:07:00 |只看作者 |坛友微信交流群

阿弥陀佛!看LZ问题心切,teve10解答辛苦,真是太感动!

其实,这只不过是一个 矩阵的转置问题,在 Matlab 环境中一个命令即可搞定,示例如下:启动matlab,在命令窗口键入:

x=[0001  0.35      0       2004

   0001  0.86      1       2005

   0001  1.92      0       2006

   0002  2.34      0       2005

   0002  0.19      1       2006];

y=x'

(以上请LZ参考,谢谢!)

使用道具

地板
Valen860108 发表于 2010-8-30 19:02:55 |只看作者 |坛友微信交流群
不好意思,小弟学识很浅,请问上面4楼steve写的:
data _null_;
  set code_set NOBS=count;
  if _n_=1 then call symput("num_codes",left(put(count,8.)));
run;

其中的: (count,8)是什么意思?这个数字更改有什么影响呢?
请指教,谢谢!

而且好像这一段删掉也没有什么关系诶,好像。。

使用道具

7
officezhushou 发表于 2013-6-10 02:45:39 |只看作者 |坛友微信交流群

在Excel中将横向排列的数据转换为纵向排列,在上文中,我们讲解了通常用的方法:Excel中数据从横向排列到纵向排列的转换的方法,实际上那是通过选择性粘贴的转置功能实现的简单将横向排列的数据转换为纵向排列,但很多情况下无法使用“转置”的功能,例如下图A1:G17区域为某网店部分商品的库存数量,“商品尺寸”是横向排列的,现在需要将这些数据按纵向排列,即将“商品尺寸”及其对应的“货号”、“数量”排列到三列中,如图J至L列所示。

本文介绍用数据透视、数组公式和VBA等三种方法来实现这种横向排列的数据转换为纵向排列,以在Excel 2010操作为例。

方法一:用数据透视表

1、利用原始数据建立数据透视表。

按组合键“Alt+D”,再按“P”键,打开“数据透视表和数据透视图向导”对话框,选择“多重合并计算数据区域”,单击“下一步”。

在弹出的对话框中再次单击“下一步”,弹出““数据透视表和数据透视图向导--步骤2b”,选择工作表中的A1:G17区域,单击“添加”按钮。

单击“完成”按钮,Excel会在新工作表中建立数据透视表。

2、通过数据透视表获取明细数据。

右击数据透视表行总计和列总计交叉的单元格,本例为H21,在弹出的快捷菜单中选择“显示详细信息”(也可双击该单元格右下角的填充柄)。

Excel会自动在新工作表中显示该数据透视表数据源的明细数据,如图所示。

3、筛选C列中的非空数据,将A至C列数据复制到所需位置即可。

方法二:用数组公式

假如将转换后的数据放在J至L列,在J2单元格输入数组公式:

=OFFSET(A$1,SMALL(IF(B$2:G$17="",4^7,ROW(B$1:G$16)),ROW(A1)),)&""

公式输入完毕按Ctrl+Shift+Enter结束,下同。然后拖动填充柄向下填充公式,直到公式返回空为止。

在K2输入数组公式:

=OFFSET(A$1,,SMALL(IF(OFFSET(B$1,MATCH(J2,A$2:A$17,),,,6)<>"",COLUMN($A:$F)),COUNTIF(J$2:J2,J2)))

在L2输入数组公式:

=OFFSET(A$1,MATCH(J2,A$2:A$17,),SMALL(IF(OFFSET(B$1,MATCH(J2,A$2:A$17,),,,6)<>"",COLUMN($A:$F)),COUNTIF(J$2:J2,J2)))

然后选择K2:L2,双击填充柄将公式填充到这两列的其余单元格。

方法三、用VBA

用下面的VBA代码也可实现上述转换,方法是按Alt+F11,打开VBA编辑器,在代码窗口中粘贴下列代码并运行。

Sub 转换()

Dim Arr1, Arr2()

Dim Rnum As Integer, Cnum As Integer, Tnum As Integer

Dim i As Integer, j As Integer, k As Integer

Application.ScreenUpdating = False

Rnum = [A65536].End(xlUp).Row

Cnum = 7

Tnum = Rnum * Cnum

Range("J2:L" & Tnum).ClearContents

Arr1 = Range("A1:G" & Rnum)

ReDim Arr2(1 To Tnum, 1 To 3)

For i = 2 To Rnum

For j = 2 To Cnum

If Arr1(i, j) <> "" Then

k = k + 1:

Arr2(k, 1) = Arr1(i, 1)

Arr2(k, 2) = Arr1(1, j)

Arr2(k, 3) = Arr1(i, j)

End If

Next

Next

Range("J2").Resize(k, UBound(Arr2, 2)) = Arr2

Application.ScreenUpdating = True

End Sub

原文:http://www.officezhushou.com/excel2010/1088.html


已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

总评分: 经验 + 3  论坛币 + 3   查看全部评分

使用道具

8
peachwei 发表于 2014-9-28 21:43:17 |只看作者 |坛友微信交流群
help reshape

使用道具

9
peachwei 发表于 2014-9-28 21:45:11 |只看作者 |坛友微信交流群
help reshape 功能, reshape wide varname, i(id) j(order)

使用道具

10
zensheran 在职认证  发表于 2015-6-23 15:41:56 |只看作者 |坛友微信交流群
peachwei 发表于 2014-9-28 21:45
help reshape 功能, reshape wide varname, i(id) j(order)
亲爱的,我们在讨论sas,不是stata吧?

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-27 01:31