boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Statistics版 - Re: 如何快速的将单行分成多行
相关主题
求教 SAS数据转化
包子问,SAS里data long to wide format
怎样在SAS里提取我想要的words呢?
question about longitudinal data
请问两道sas adv的题..
SAS ADV passed!!!
[合集] 请教:关于统计工作都做些什么
请教SAS 问题
data reading question in SAS
求助:SAS使用问题(读数据)
相关话题的讨论汇总
话题: index话题: data话题: sas话题: clean话题: new
进入Statistics版参与讨论
1 (共1页)
B******y
发帖数: 9065
1
原始数据如下
ID Index
A 11
B 1 & 8
C 2, 3, 10
D 5 7
E 7 and 8
希望新数据为
ID Index
A 11
B 1
B 8
C 2
C 3
C 10
D 5
D 7
E 7
E 8
也就是说,原始数据中Index有多次输入,delimiter有&,逗号,空格,甚至是字母(
目前还没有发现第5种情况,但估计可能会有:;这样的)。所以必须将单行分成多行
,每行只能有一个Index数字(暂不考虑每个ID有重复Index的可能)。希望能有最简洁
快速的方法。多谢了!
m******r
发帖数: 1033
2
这种玩意在spark里面叫explode, 在R里面也有个类似函数。
在sas里面, 最简单的方法就是把你所有的垃圾当成变量读进来。 反正我看最多就不
超过10个变量。 第二步,用proc transpose, wide to long, 简单吧, 第三步,把缺
失值删掉。
B******y
发帖数: 9065
3
是用SAS来做。“把你所有的垃圾当成变量读进来”,这是问题的核心和关键,我需要
的就是这步的快捷方法。当然最好能避免proc transpose,要是死缠硬磨我也能做出来
,但不符合快速的要求。这里的高手很多,希望能提供高效简洁的办法。

【在 m******r 的大作中提到】
: 这种玩意在spark里面叫explode, 在R里面也有个类似函数。
: 在sas里面, 最简单的方法就是把你所有的垃圾当成变量读进来。 反正我看最多就不
: 超过10个变量。 第二步,用proc transpose, wide to long, 简单吧, 第三步,把缺
: 失值删掉。

m******r
发帖数: 1033
4
我就是高手 哈哈。 我这方法就是简洁高效, best practice of the industry
读垃圾,是sas的长项, 我看你这个文本文件需要用dlm =‘,&’ missover
你确定有 and在里面? 建议手工去掉and
m******r
发帖数: 1033
5
干脆把and也读进来。
data my_data;
infile 'my_file.csv' ;
input index
char_1 :$10.
char_2 :$10.
char_3 :$10.
dlm = ',&'
missover ;
num_1 = input(char_1, :Z10.);
num_2 = input(char_2, :Z10.);
num_3 = input(char_3, :Z10.);
run;
不做sas很久啦,虫子肯定有, 思路就是这个思路。
d********m
发帖数: 3662
6
一看你就是个高手

【在 m******r 的大作中提到】
: 我就是高手 哈哈。 我这方法就是简洁高效, best practice of the industry
: 读垃圾,是sas的长项, 我看你这个文本文件需要用dlm =‘,&’ missover
: 你确定有 and在里面? 建议手工去掉and

m******r
发帖数: 1033
7
哪个高手一个操作能从spark 讲到R讲到SAS ?
R操作如下:
Unnest a list column.
Description
If you have a list-column, this makes each element of the list its own row.
List-columns can either be atomic vectors or data frames.
spark就不说了。
SAS里面用数据步做长宽变换也不是新鲜事 ,效率提高十几倍,代码也就十几行

【在 d********m 的大作中提到】
: 一看你就是个高手
B******y
发帖数: 9065
8
多谢你的热心帮忙!不过我不是太明白你的意思。假设我的原始数据已经如下输入好了:
data my_data;
input id $ index $200.;
datalines;
A 11
B 1 & 8
C 2, 3, 10
D 5 7
E 7 and 8
;;;;
那么怎么就my_date分解行呢?像你这样重输是没有意义的,因为index可能含的数值很
多,有超过10个以上的可能,所以重要的第一步是先读出数值的个数,然后再分解用
transpose转行。我的最初思路就是如此,但不够快速简洁,希望能有更好的办法。

【在 m******r 的大作中提到】
: 干脆把and也读进来。
: data my_data;
: infile 'my_file.csv' ;
: input index
: char_1 :$10.
: char_2 :$10.
: char_3 :$10.
: dlm = ',&'
: missover ;
: num_1 = input(char_1, :Z10.);

B******y
发帖数: 9065
9
实际数据成千上万,而且每过段时间就自动更新,要手动的话那还不累吐血了。。。

【在 m******r 的大作中提到】
: 我就是高手 哈哈。 我这方法就是简洁高效, best practice of the industry
: 读垃圾,是sas的长项, 我看你这个文本文件需要用dlm =‘,&’ missover
: 你确定有 and在里面? 建议手工去掉and

m******r
发帖数: 1033
10
我不知道你怎么定义简洁高效。 我的定义是小程序20秒之内跑完, 大程序60秒,超大
的180秒。 简洁的意思扫一眼就知道他在干什么。
或者你sas里调用R, unnest是标准函数。
相关主题
question about longitudinal data
请问两道sas adv的题..
SAS ADV passed!!!
[合集] 请教:关于统计工作都做些什么
进入Statistics版参与讨论
B******y
发帖数: 9065
11
假定SAS有个unnest的命令,然后一步到位:
data newdata;
set mydata;
by ID;
newindex = unnest(index, dlm=" &,AND");
delete index;
run;
有这种可能么?

【在 m******r 的大作中提到】
: 我不知道你怎么定义简洁高效。 我的定义是小程序20秒之内跑完, 大程序60秒,超大
: 的180秒。 简洁的意思扫一眼就知道他在干什么。
: 或者你sas里调用R, unnest是标准函数。

m******r
发帖数: 1033
12
基本没这种可能。 不知道JMP能不能做,他和R有点类似。
你避免proc transpose的方式不太对。 SAS的特点就是用各种过程外加选项代替编程。
proc transpose可以说是非常基本的东西,实现的功能又是很直观的,写起来只有几行
命令 不太清楚你为什么不喜欢它。

【在 B******y 的大作中提到】
: 假定SAS有个unnest的命令,然后一步到位:
: data newdata;
: set mydata;
: by ID;
: newindex = unnest(index, dlm=" &,AND");
: delete index;
: run;
: 有这种可能么?

a****0
发帖数: 51
13
shell script will do it.
D******n
发帖数: 2836
14
should work for you case
data new_data;
set my_data;
clean = compress(index," ", 'kd');
do i=1 to countw(clean);
new_index = scan(clean, i);
output;
end;
drop i clean;
run;

了:

【在 B******y 的大作中提到】
: 多谢你的热心帮忙!不过我不是太明白你的意思。假设我的原始数据已经如下输入好了:
: data my_data;
: input id $ index $200.;
: datalines;
: A 11
: B 1 & 8
: C 2, 3, 10
: D 5 7
: E 7 and 8
: ;;;;

D******n
发帖数: 2836
15
To be more generic and account for situations like "7,9" or "7and8"
data new_data;
set my_data;
clean = prxchange('s/[^0-9]/ /i', -1, index);
do i=1 to countw(clean);
new_index = scan(clean, i);
output;
end;
drop i clean;
run;
proc print;run;

【在 D******n 的大作中提到】
: should work for you case
: data new_data;
: set my_data;
: clean = compress(index," ", 'kd');
: do i=1 to countw(clean);
: new_index = scan(clean, i);
: output;
: end;
: drop i clean;
: run;

B******y
发帖数: 9065
16
牛!!!
你给的两个程序都可以顺畅运行,达到了简洁和快速的目的。还有虫版主也私下发信给
出了思路,在此一并表示感谢!

【在 D******n 的大作中提到】
: To be more generic and account for situations like "7,9" or "7and8"
: data new_data;
: set my_data;
: clean = prxchange('s/[^0-9]/ /i', -1, index);
: do i=1 to countw(clean);
: new_index = scan(clean, i);
: output;
: end;
: drop i clean;
: run;

B******y
发帖数: 9065
17
大侠,不好意思,能否再麻烦一下,还有一个要求将原数据里的dlm全部换成,如下:
ID Index
A 11
B 1, 8
C 2, 3, 10
D 5,7
E 7,8
应该有两种方式,一种是直接从原数据my_data转,另一种是从new_data倒转回来。有
些特殊例子要考虑,譬如“7 and 8”和“7and8”应该全都转成“7, 8”(,后面有个空
格),所以是否第二种倒转更好一些?

【在 D******n 的大作中提到】
: should work for you case
: data new_data;
: set my_data;
: clean = compress(index," ", 'kd');
: do i=1 to countw(clean);
: new_index = scan(clean, i);
: output;
: end;
: drop i clean;
: run;

D******n
发帖数: 2836
18
Then use regex again, regex is very powerful for text processing.
data new_data;
set my_data;
clean = prxchange('s/[^0-9]/ /i', -1, index);
new_index = prxchange('s/s+/, /i', -1, strip(clean));
run;

【在 B******y 的大作中提到】
: 大侠,不好意思,能否再麻烦一下,还有一个要求将原数据里的dlm全部换成,如下:
: ID Index
: A 11
: B 1, 8
: C 2, 3, 10
: D 5,7
: E 7,8
: 应该有两种方式,一种是直接从原数据my_data转,另一种是从new_data倒转回来。有
: 些特殊例子要考虑,譬如“7 and 8”和“7and8”应该全都转成“7, 8”(,后面有个空
: 格),所以是否第二种倒转更好一些?

m******r
发帖数: 1033
19
原来是老朋友哈根达斯啊。

【在 D******n 的大作中提到】
: Then use regex again, regex is very powerful for text processing.
: data new_data;
: set my_data;
: clean = prxchange('s/[^0-9]/ /i', -1, index);
: new_index = prxchange('s/s+/, /i', -1, strip(clean));
: run;

D******n
发帖数: 2836
20
老版友 >_
【在 m******r 的大作中提到】
: 原来是老朋友哈根达斯啊。
相关主题
请教SAS 问题
data reading question in SAS
求助:SAS使用问题(读数据)
SAS 高手帮忙看看这个数据能用lifetest吗?
进入Statistics版参与讨论
v*******e
发帖数: 11604
21
唉,看你们天天研究怎么算1+1=2,笑死个人了。不知道有个东西叫做计算器吗?那SAS
是老掉牙的东西,能不用它处理数据就不要用。顶多就是读入数据,call个函数,这样
就行了。数据整理工作还是交给更容易的软件去处理。你们讨论的问题,在perl,
python程序员眼里都是幼儿园的过家家。你们随便花三天时间,学个perl或者python,
这样的问题就都解决了。
h**********d
发帖数: 1
22
Using R:
data: #data is dataframe
ID Index
A 11
B 1 & 8
C 2, 3, 10
D 5 7
E 7 and 8
then:

#extract number from string
string2vector<-unname(sapply(data$Index,function(x) as.numeric(unlist(
regmatches(x,gregexpr("[0-9]+",x))))))
#get counts of the numbers in string
len_vector<-sapply(string2vector,length)
new_data<-data.frame(ID=rep(data$ID,len_vector),Index=unlist(string2vector))
new_data: #new_data is your expect

ID Index
1 A 11
2 B 1
3 B 8
4 C 2
5 C 3
6 C 10
7 D 5
8 D 7
9 E 7
10 E 8
m******r
发帖数: 1033
23
真靠SAS吃饭的笑而不答.

SAS

【在 v*******e 的大作中提到】
: 唉,看你们天天研究怎么算1+1=2,笑死个人了。不知道有个东西叫做计算器吗?那SAS
: 是老掉牙的东西,能不用它处理数据就不要用。顶多就是读入数据,call个函数,这样
: 就行了。数据整理工作还是交给更容易的软件去处理。你们讨论的问题,在perl,
: python程序员眼里都是幼儿园的过家家。你们随便花三天时间,学个perl或者python,
: 这样的问题就都解决了。

B******y
发帖数: 9065
24
你可真是把prxchange玩得出神入化呀。貌似这是个perl命令,我都看不懂是怎么样的
语言结构。
你给的这个code里面new_index没有对clean做任何改变呀,怎么样才能把“,”加在每
两个数字之间呀?

【在 D******n 的大作中提到】
: Then use regex again, regex is very powerful for text processing.
: data new_data;
: set my_data;
: clean = prxchange('s/[^0-9]/ /i', -1, index);
: new_index = prxchange('s/s+/, /i', -1, strip(clean));
: run;

B******y
发帖数: 9065
25
多谢!R命令里的gregexpr应该是和SAS里的prxchange功能是一样的。学习了。

【在 h**********d 的大作中提到】
: Using R:
: data: #data is dataframe
: ID Index
: A 11
: B 1 & 8
: C 2, 3, 10
: D 5 7
: E 7 and 8
: then:
:

B******y
发帖数: 9065
26
三天能学会么?
要知道FDA只接受SAS的数据,根本没有别的选择,如果你不是在制药行业混饭吃,很难
理解为什么这么多人还在讨论SAS。

SAS

【在 v*******e 的大作中提到】
: 唉,看你们天天研究怎么算1+1=2,笑死个人了。不知道有个东西叫做计算器吗?那SAS
: 是老掉牙的东西,能不用它处理数据就不要用。顶多就是读入数据,call个函数,这样
: 就行了。数据整理工作还是交给更容易的软件去处理。你们讨论的问题,在perl,
: python程序员眼里都是幼儿园的过家家。你们随便花三天时间,学个perl或者python,
: 这样的问题就都解决了。

v*******e
发帖数: 11604
27

我上小学的小孩我都三天教会了python。
我干过FDA的SAS项目。
FDA只接受SAS的数据,可没说只接收其原始数据,像楼主那样的。原始数据处理根本就
不是SAS的长处。

【在 B******y 的大作中提到】
: 三天能学会么?
: 要知道FDA只接受SAS的数据,根本没有别的选择,如果你不是在制药行业混饭吃,很难
: 理解为什么这么多人还在讨论SAS。
:
: SAS

B******y
发帖数: 9065
28
问题是像我们这样本身没有多少编程经验的,学个新语言很困难。
收到的数据如果就是SAS,难道不成还先转成其他的语言结构,进行数据处理以后再转
换回SAS?这样的话就无效率可言,更何况很多时候只能通过SAS的server,根本就没有
别的选择。

【在 v*******e 的大作中提到】
:
: 我上小学的小孩我都三天教会了python。
: 我干过FDA的SAS项目。
: FDA只接受SAS的数据,可没说只接收其原始数据,像楼主那样的。原始数据处理根本就
: 不是SAS的长处。

t*****a
发帖数: 459
29
你们能推荐个python for dummies的书吗?最好是网上能找到的电子书。我以前看的
python书,是搞计算机的人写的,他解释得很详细,但是都用的计算机的术语,问题是
我其他的计算机语言都不懂,所以看得累死了还不得要领。有0基础容易看的吗?
m******r
发帖数: 1033
30
得看你学python干什么用。 目的是什么。
相关主题
问一个简单的SAS问题,多谢
请教SAS的问题,时间变量读取,包子答谢
mysql 问题
有人用wps或r么
进入Statistics版参与讨论
y****i
发帖数: 4109
31
一点编程基础都没有的 就 Learn Python the Hard Way吧, 比较傻瓜式,还有中文
翻译的,叫笨办法学python.
安装的话,就anaconda,啥都帮你搞定。 不要搞原生的python不然装那些包能搞死你。
1 (共1页)
进入Statistics版参与讨论
相关主题
求助:SAS使用问题(读数据)
SAS 高手帮忙看看这个数据能用lifetest吗?
问一个简单的SAS问题,多谢
请教SAS的问题,时间变量读取,包子答谢
mysql 问题
有人用wps或r么
请教如何用SAS处理这个RANDOM SAMPLING的问题
[合集] SAS的问题
刚工作3月的新人,请教职业前景
问一个SAS lifereg的问题!
相关话题的讨论汇总
话题: index话题: data话题: sas话题: clean话题: new