在R中创建类似SAS的库

在R中创建类似SAS的库,r,sas,R,Sas,在SAS中,有一种创建库的方法(使用LIBNAME)。这很有帮助,因为当我们必须进行长时间的数据处理时,我们并不总是更改数据集名称。因此,如果我们想再次使用数据集,而不改变名称,我们可以将其放入库中。因此,即使数据集名称相同,但由于它们位于不同的库中,我们也可以一起处理它们 我的问题是,R中是否有这样的选项可以创建库(或R中的单独文件夹),以便我们可以将数据保存在那里 下面是一个例子: 假设我有一个数据集“dat1”。我总结了var3的dat1 var1和var2中的变量 proc summar

在SAS中,有一种创建库的方法(使用LIBNAME)。这很有帮助,因为当我们必须进行长时间的数据处理时,我们并不总是更改数据集名称。因此,如果我们想再次使用数据集,而不改变名称,我们可以将其放入库中。因此,即使数据集名称相同,但由于它们位于不同的库中,我们也可以一起处理它们

我的问题是,R中是否有这样的选项可以创建库(或R中的单独文件夹),以便我们可以将数据保存在那里

下面是一个例子:

假设我有一个数据集“dat1”。我总结了var3的dat1 var1和var2中的变量

proc summary data=dat1 nway missing;
  var var1 var2;
  class var3;
  output out=tmp.dat1 (drop = _freq_ _type_) sum = ;
  run;
然后我将dat1和dat2合并,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;
现在,我在合并后再次汇总数据集dat1,以检查var1和VAR2的值在合并前后是否保持不变

proc summary data=dat1 nway missing;
  var var1 var2;
  class var3;
  output out=tmp1.dat1 (drop = _freq_ _type_) sum = ;
  run;
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))

dat1将存储在此文件夹中。

根据我从SAS Online Help收集的信息,SAS库是存储在文件夹中的一组数据集,可以作为一个单元引用。R中的等效方法是使用
save
存储要保存的R对象:

save(obj1, obj2, etc, file = "stored_objects.rda")
可以使用
load
加载对象


编辑:我真的不明白为什么有一个或两个额外的对象是这么大的问题。但是,如果您想减少对象的数量,只需将结果放在
列表中

命名环境是实现您想要的效果的众多方法之一

就个人而言,如果没有太多不同的数据帧或列表,我会倾向于以其他方式组织它,比如在数据帧或列表中,这取决于数据的结构。但是,如果每件事都包含许多不同类型的数据和功能,那么环境可能会更好。它们在中有描述,许多人都在讨论它们


但是经过反思,R-Studio可能更接近您思考问题的方式(如果您还没有使用R-Studio,我强烈推荐)。看看项目是如何工作的。

下面是一个使用
SOAR
包和命名环境的示例

引自小插曲

对象不必总是保存在内存中。“保存”功能可用于将光盘上的对象保存到文件中,通常扩展名为.RData。然后可以从内存中删除这些对象,然后使用load函数显式地调用它们

SOAR软件包提供了将对象存储在光盘上的简单方法,但其方式应确保它们在搜索路径上保持可见,即,如果再次需要某个对象,则会自动将其加载到内存中。它使用与包相同的延迟加载机制,但这里提供的功能更具动态性和灵活性

阅读这篇文章会很有用

库(SOAR)
图书馆(plyr)
库(sqldf)
种子(1)
#创建一些虚拟数据创建一个命名环境

tmp您(似乎)对SAS的库有两个不同的方面感兴趣

  • 存储数据文件的目录的规范
  • 通过指定不同的位置,可以轻松地将分析指向不同的同名数据集集
按那个顺序拿这些

回答第一个问题的问题是,R和SAS对于数据的存储方式有不同的模型。R将数据存储在内存中,按特定的搜索顺序排列在环境中。SAS将数据存储在磁盘上,数据集的名称对应于指定目录中的文件名(内存中可能存在缓存以进行优化,但从概念上讲,这就是数据的存储方式)。R可以使用
save()
将(组)对象存储在磁盘上的文件中,并使用
load()
将它们带回内存。可以在这些函数调用中指定文件名和目录(因此)。您可以有多个
.RData
文件,每个文件都包含名为
dat1
dat2
等的对象,可以在运行分析之前加载这些对象,并且可以将结果写入(其他)
.RData
文件

另一种方法是使用一个扩展,它提供由磁盘存储而不是内存支持的数据类型。我还没有和他们中的任何人讨论过他们在这种情况下的工作情况,但这是一种选择。[编辑:有这个想法的详细示例。]

你的第二部分可以用不同的方法来处理。由于R使用内存中的数据,答案将集中在安排不同的环境(每个环境可以包含不同但名称相同的数据集)和控制通过
attach()
ing和
detach()
ing将环境从搜索路径中分离出来来访问哪个环境。您仍然没有数据的磁盘备份,但这是前面的问题


最后,@joran的警告是相关的。对R中可能不同(但相关)的数据集执行一组任务的问题的解决方案是编写一个函数来完成这项工作。该函数具有参数。在函数中,参数由参数列表中给出的名称引用。调用函数时,函数调用指定向其发送哪一组特定数据;函数内部和外部的名称不必相互关联。关于在一个列表中存储多组数据的建议隐含地以这种方式处理问题;依次为列表中的每组数据调用该函数。那么,名字并不重要。

这个问题对SAS用户来说可能有意义,但对我们其他人来说没有意义。你为什么不解释一下你想从R中得到什么,以及你目前的做事方式是如何缺乏的?也许是带着一个?到
save(obj1, obj2, etc, file = "stored_objects.rda")
library(SOAR)
library(plyr)
library(sqldf)
set.seed(1)
# create some dummy data create a named envirment
tmp <- new.env(parent = .GlobalEnv)
dat1 <- data.frame(var1 = rnorm(50), var2 = sample(50, replace = TRUE), var3 = sample(letters[1:5], 
    50, replace = TRUE))
tmp$dat1 <- ddply(dat1, .(var3), summarise, var1 = sum(var1, na.rm = TRUE), 
    var2 = sum(var2, na.rm = TRUE))
tmp$dat2 <- data.frame(Var3 = sample(letters[1:5], 20, replace = TRUE), Var4 = 1:20)
# store as a SOAR cached object (on disc)
Store(tmp, lib = "tmp")

# replace dat1 within the global enviroment using sqldf create a new
# environment to work in with the correct version of dat1 and dat2
sqlenv <- tmp
sqlenv$dat1 <- dat1

dat1 <- sqldf("select a.*,b.* from dat1 a left join dat2 b on a.var3=b.var3", 
    envir = sqlenv)

# create a new named enviroment tmp1
tmp1 <- new.env(parent = .GlobalEnv)

tmp1$dat1 <- ddply(dat1, .(var3), summarise, var1 = sum(var1, na.rm = TRUE), 
    var2 = sum(var2, na.rm = TRUE))

# store using a SOAR cache
Store(tmp1, lib = "tmp")


tmp1$dat1

##   var3   var1 var2
## 1    a  1.336  378
## 2    b  8.514 1974
## 3    c  5.795  624
## 4    d -8.828  936
## 5    e 20.846 1490

tmp$dat1

##   var3    var1 var2
## 1    a  0.4454  126
## 2    b  1.4190  329
## 3    c  1.9316  208
## 4    d -2.9427  312
## 5    e  4.1691  298