在SAS中有一种创建库的方法(使用LIBNAME).这很有用,因为当我们必须进行长数据处理时,我们不会始终更改数据集名称.因此,如果我们想要再次使用数据集而不更改名称,我们可以放入库中.因此,即使数据集名称相同,但由于它们位于不同的库中,我们可以一起处理它们.
我的问题是R中是否有任何可以创建库(或R中的单独文件夹)的选项,以便我们可以在那里保存数据?
这是一个例子:
假设我有一个数据集"dat1".我总结了var1中dat1 var1和var2中的变量.
proc summary data=dat1 nway missing;
var var1 var2;
class var3;
output out=tmp.dat1 (drop = _freq_ _type_) sum = ;
run;
Run Code Online (Sandbox Code Playgroud)
然后我将dat1与dat2合并,这是另一个数据集.dat1和dat2都有公共变量var3,我合并了它.我再次创建了新的数据集dat1.
proc sql;
create table dat1 as
select a.*,b.*
from dat1 a left join tmp.dat2 b
on a.var3=b.var3;
quit;
Run Code Online (Sandbox Code Playgroud)
现在,我再次在合并后总结数据集dat1,以检查var1和var 2的值在合并之前和之后是否保持不变.
proc summary data=dat1 nway missing;
var var1 var2;
class var3;
output out=tmp1.dat1 (drop = _freq_ _type_) sum = ;
run;
Run Code Online (Sandbox Code Playgroud)
R中的等效代码将是
dat3<-ddply(dat1,.(var3),summarise,var1=sum(var1,na.rm=TRUE),var2=sum(var2,na.rm=TRUE))
dat1<-sqldf("select a.*,b.* from dat1 a left join dat2 b on a.var3=b.var3")
dat4<-ddply(dat1,.(var3),summarise,var1=sum(var1,na.rm=TRUE),var2=sum(var2,na.rm=TRUE))
Run Code Online (Sandbox Code Playgroud)
在SAS的情况下,我只使用了2个数据集名称.但是在R的情况下,我使用4个数据集名称.因此,如果我正在为数据处理编写4000行代码,那么有太多的数据集名称有时会变得势不可挡.在sas中,使用相同的数据集名称变得容易,因为我使用的是除默认工作库之外的2个库tmp,tmp1.
在SAS中,库定义为:
LIBNAME tmp "directory_path\folder_name";
Run Code Online (Sandbox Code Playgroud)
在此文件夹中,将存储dat1.
根据我从SAS在线帮助中收集的信息,SAS库是一组存储在文件夹中的数据集,可以作为一个单元引用.R中的等价物是使用以下方法存储要保存的R对象save:
save(obj1, obj2, etc, file = "stored_objects.rda")
Run Code Online (Sandbox Code Playgroud)
加载对象可以使用load.
编辑:我真的不明白为什么有一个或两个额外的对象是一个很大的问题.但是,如果你想减少tge数量的对象,只需将结果放入list.
SAS的库有两个独立的方面(看起来)你感兴趣.
按顺序拍摄这些.
回答第一个问题是R和SAS有不同的数据存储方式.R将数据存储在存储器中,以按特定搜索顺序排列的环境进行组织.SAS将数据存储在磁盘上,数据集的名称对应于指定目录中的文件名(内存中可能存在缓存以进行优化,但从概念上讲,这就是数据的存储方式).R可以将(对象)对象存储在磁盘上的文件中,save()并使用它们将它们带回内存load().可以在那些函数调用中指定文件名和目录(因此Paul的回答).你可以有几个.RData文件,命名为每个包含的对象dat1,dat2等它可以在运行分析之前加载,并且可以将结果写到(其他).RData文件.
另一种方法是使用一种扩展,它提供由磁盘存储而不是内存支持的数据类型.我没有任何经验可以谈论他们在这种情况下的表现如何,但这是一种选择.[编辑:mnel的答案有一个关于这个想法的详细例子.]
你的第二部分可以采用不同的方式.由于R在内存中的数据,答案将重点围绕安排不同的环境中(每个都可以包含不同,但相同名称的数据集),并控制哪些人会通过访问attach()ING和detach()从搜索路径(什么荷兰国际集团的环境Glen_b的回答得到向).您仍然没有数据的磁盘备份,但这是以前的问题.
最后,@ joran的警告是相关的.在R中对可能不同(但相关)的数据集执行一组任务的问题的解决方案是编写一个函数来完成工作.该函数有参数.在函数内,参数由参数列表中给出的名称引用.调用该函数时,函数调用指定的哪一组特定数据被发送给它; 函数内外的名称不需要彼此有任何关系.关于在列表中存储多组数据的建议隐含地以这种方式解决问题; 依次为列表中的每组数据调用该函数.那么名字并不重要.