3

在 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 合并,这是另一个数据集。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 和 var 2 的值在合并前后是否保持不变。

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))

在 SAS 的情况下,我只使用了 2 个数据集名称。但在 R 的情况下,我使用 4 个数据集名称。因此,如果我正在编写 4000 行数据处理代码,有时数据集名称过多会让人不知所措。在 sas 中,与我使用 2 个库 tmp、tmp1 而非默认工作库相同的数据集名称变得很容易。

在 SAS 中,库定义为:

LIBNAME tmp "directory_path\folder_name";

在此文件夹中,将存储 dat1。

4

4 回答 4

6

根据我从 SAS 在线帮助中收集到的信息,SAS 库是一组存储在文件夹中的数据集,可以作为一个单元引用。R 中的等价物是使用以下命令存储您要保存的 R 对象save

save(obj1, obj2, etc, file = "stored_objects.rda")

加载对象可以使用load.

编辑:我真的不明白为什么有一两个额外的对象是一个很大的问题。但是,如果您想减少对象的 tge 数量,只需将结果放入list.

于 2012-10-14T11:17:08.383 回答
5

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

  • 指定存储数据文件的目录
  • 只需指定不同的位置,即可轻松地将分析指向一组不同的同名数据集

按照这些顺序。

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

另一种方法是使用一个扩展,它提供由磁盘存储而不是内存支持的数据类型。我没有与他们中的任何人谈论他们在这种情况下工作得如何,但这是一个选择。[编辑:mnel's answer有一个关于这个想法的详细例子。]

您的第二部分可以通过不同的方式进行。由于 R 使用内存中的数据,答案将集中在安排不同的环境(每个环境可以包含不同但名称相同的数据集)并控制通过搜索路径中的环境访问哪个环境(attach()Glen_b的答案是什么)朝向)。您仍然没有数据的磁盘支持,但这是之前的问题。detach()

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

于 2012-10-16T22:52:28.590 回答
4

这是使用SOAR包和命名环境的示例

引用小插图

对象不必总是保存在内存中。函数 save 可用于将光盘上的对象保存在一个文件中,通常带有 .RData 扩展名。然后可以从内存中删除对象,然后使用 load 函数显式调用这些对象。

SOAR 包提供了将对象存储在磁盘上的简单方法,但以这样一种方式,它们在搜索路径上仍然作为 promise 可见,也就是说,如果再次需要一个对象,它会自动加载到内存中。它使用与包相同的延迟加载机制,但这里提供的功能更加动态和灵活

阅读整个小插图会很有用

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

我不确定您是否应该期望tmp1$dat1tmp$dat1相同(无论如何,以我为例)

于 2012-10-16T22:49:20.577 回答
2

命名环境是实现您想要的效果的多种方式之一。

就个人而言,如果没有很多不同的数据框或列表,我会倾向于以其他方式组织它,例如在数据框或列表中,这取决于您的数据的结构方式。但是,如果每件事都包含许多不同类型的数据和功能,那么环境可能会好得多。帮助中对它们进行了描述,并且r-blogs的许多帖子都讨论了它们。

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

于 2012-10-16T21:51:24.953 回答