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是标准函数。 |
|
|
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 的大作中提到】 : 原来是老朋友哈根达斯啊。
|
|
|
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 | |
|
|
y****i 发帖数: 4109 | 31 一点编程基础都没有的 就 Learn Python the Hard Way吧, 比较傻瓜式,还有中文
翻译的,叫笨办法学python.
安装的话,就anaconda,啥都帮你搞定。 不要搞原生的python不然装那些包能搞死你。 |